diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-20 21:08:00 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-20 21:08:00 +0000 |
commit | be59dd1d43332496def276c8d3e78fc82e94273a (patch) | |
tree | 19c25e5a7e7f88a0ac4bd797bf70ac48603656cc /spec/features | |
parent | 855bf0533bc5d5df2821e9a5951fae4f153f7492 (diff) | |
download | gitlab-ce-be59dd1d43332496def276c8d3e78fc82e94273a.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/features')
11 files changed, 123 insertions, 1457 deletions
diff --git a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb index e1177bedd2d..2d7f5822996 100644 --- a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb +++ b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb @@ -7,24 +7,11 @@ describe 'Dropdown assignee', :js do let!(:project) { create(:project) } let!(:user) { create(:user, name: 'administrator', username: 'root') } - let!(:user_john) { create(:user, name: 'John', username: 'th0mas') } - let!(:user_jacob) { create(:user, name: 'Jacob', username: 'otter32') } - let(:filtered_search) { find('.filtered-search') } let(:js_dropdown_assignee) { '#js-dropdown-assignee' } let(:filter_dropdown) { find("#{js_dropdown_assignee} .filter-dropdown") } - def dropdown_assignee_size - filter_dropdown.all('.filter-dropdown-item').size - end - - def click_assignee(text) - find('#js-dropdown-assignee .filter-dropdown .filter-dropdown-item', text: text).click - end - before do project.add_maintainer(user) - project.add_maintainer(user_john) - project.add_maintainer(user_jacob) sign_in(user) create(:issue, project: project) @@ -32,37 +19,10 @@ describe 'Dropdown assignee', :js do end describe 'behavior' do - it 'opens when the search bar has assignee:' do - input_filtered_search('assignee:', submit: false, extra_space: false) - - expect(page).to have_css(js_dropdown_assignee, visible: true) - end - - it 'closes when the search bar is unfocused' do - find('body').click - - expect(page).to have_css(js_dropdown_assignee, visible: false) - end - - it 'shows loading indicator when opened' do - slow_requests do - # We aren't using `input_filtered_search` because we want to see the loading indicator - filtered_search.set('assignee:') - - expect(page).to have_css('#js-dropdown-assignee .filter-dropdown-loading', visible: true) - end - end - - it 'hides loading indicator when loaded' do - input_filtered_search('assignee:', submit: false, extra_space: false) - - expect(find(js_dropdown_assignee)).not_to have_css('.filter-dropdown-loading') - end - it 'loads all the assignees when opened' do input_filtered_search('assignee:', submit: false, extra_space: false) - expect(dropdown_assignee_size).to eq(4) + expect_filtered_search_dropdown_results(filter_dropdown, 2) end it 'shows current user at top of dropdown' do @@ -72,109 +32,6 @@ describe 'Dropdown assignee', :js do end end - describe 'filtering' do - before do - input_filtered_search('assignee:', submit: false, extra_space: false) - - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_john.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name) - end - - it 'filters by name' do - input_filtered_search('jac', submit: false, extra_space: false) - - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_no_content(user.name) - end - - it 'filters by case insensitive name' do - input_filtered_search('JAC', submit: false, extra_space: false) - - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_no_content(user.name) - end - - it 'filters by username with symbol' do - input_filtered_search('@ott', submit: false, extra_space: false) - - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_no_content(user_john.name) - end - - it 'filters by case insensitive username with symbol' do - input_filtered_search('@OTT', submit: false, extra_space: false) - - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_no_content(user_john.name) - end - - it 'filters by username without symbol' do - input_filtered_search('ott', submit: false, extra_space: false) - - wait_for_requests - - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_no_content(user_john.name) - end - - it 'filters by case insensitive username without symbol' do - input_filtered_search('OTT', submit: false, extra_space: false) - - wait_for_requests - - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name) - expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_no_content(user_john.name) - end - end - - describe 'selecting from dropdown' do - before do - input_filtered_search('assignee:', submit: false, extra_space: false) - end - - it 'fills in the assignee username when the assignee has not been filtered' do - click_assignee(user_jacob.name) - - wait_for_requests - - expect(page).to have_css(js_dropdown_assignee, visible: false) - expect_tokens([assignee_token(user_jacob.name)]) - expect_filtered_search_input_empty - end - - it 'fills in the assignee username when the assignee has been filtered' do - input_filtered_search('roo', submit: false, extra_space: false) - click_assignee(user.name) - - wait_for_requests - - expect(page).to have_css(js_dropdown_assignee, visible: false) - expect_tokens([assignee_token(user.name)]) - expect_filtered_search_input_empty - end - - it 'selects `None`' do - find('#js-dropdown-assignee .filter-dropdown-item', text: 'None').click - - expect(page).to have_css(js_dropdown_assignee, visible: false) - expect_tokens([assignee_token('None')]) - expect_filtered_search_input_empty - end - - it 'selects `Any`' do - find('#js-dropdown-assignee .filter-dropdown-item', text: 'Any').click - - expect(page).to have_css(js_dropdown_assignee, visible: false) - expect_tokens([assignee_token('Any')]) - expect_filtered_search_input_empty - end - end - describe 'selecting from dropdown without Ajax call' do before do Gitlab::Testing::RequestBlockerMiddleware.block_requests! @@ -186,59 +43,11 @@ describe 'Dropdown assignee', :js do end it 'selects current user' do - find('#js-dropdown-assignee .filter-dropdown-item', text: user.username).click + find("#{js_dropdown_assignee} .filter-dropdown-item", text: user.username).click expect(page).to have_css(js_dropdown_assignee, visible: false) expect_tokens([assignee_token(user.username)]) expect_filtered_search_input_empty end end - - describe 'input has existing content' do - it 'opens assignee dropdown with existing search term' do - input_filtered_search('searchTerm assignee:', submit: false, extra_space: false) - - expect(page).to have_css(js_dropdown_assignee, visible: true) - end - - it 'opens assignee dropdown with existing author' do - input_filtered_search('author:@user assignee:', submit: false, extra_space: false) - - expect(page).to have_css(js_dropdown_assignee, visible: true) - end - - it 'opens assignee dropdown with existing label' do - input_filtered_search('label:~bug assignee:', submit: false, extra_space: false) - - expect(page).to have_css(js_dropdown_assignee, visible: true) - end - - it 'opens assignee dropdown with existing milestone' do - input_filtered_search('milestone:%v1.0 assignee:', submit: false, extra_space: false) - - expect(page).to have_css(js_dropdown_assignee, visible: true) - end - - it 'opens assignee dropdown with existing my-reaction' do - input_filtered_search('my-reaction:star assignee:', submit: false, extra_space: false) - - expect(page).to have_css(js_dropdown_assignee, visible: true) - end - end - - describe 'caching requests' do - it 'caches requests after the first load' do - input_filtered_search('assignee:', submit: false, extra_space: false) - initial_size = dropdown_assignee_size - - expect(initial_size).to be > 0 - - new_user = create(:user) - project.add_maintainer(new_user) - find('.filtered-search-box .clear-search').click - input_filtered_search('assignee:', submit: false, extra_space: false) - - expect(dropdown_assignee_size).to eq(initial_size) - end - end end diff --git a/spec/features/issues/filtered_search/dropdown_author_spec.rb b/spec/features/issues/filtered_search/dropdown_author_spec.rb index bd22eb1056b..6567bbcf8a2 100644 --- a/spec/features/issues/filtered_search/dropdown_author_spec.rb +++ b/spec/features/issues/filtered_search/dropdown_author_spec.rb @@ -7,32 +7,11 @@ describe 'Dropdown author', :js do let!(:project) { create(:project) } let!(:user) { create(:user, name: 'administrator', username: 'root') } - let!(:user_john) { create(:user, name: 'John', username: 'th0mas') } - let!(:user_jacob) { create(:user, name: 'Jacob', username: 'ooter32') } - let(:filtered_search) { find('.filtered-search') } let(:js_dropdown_author) { '#js-dropdown-author' } - - def send_keys_to_filtered_search(input) - input.split("").each do |i| - filtered_search.send_keys(i) - end - - sleep 0.5 - wait_for_requests - end - - def dropdown_author_size - page.all('#js-dropdown-author .filter-dropdown .filter-dropdown-item').size - end - - def click_author(text) - find('#js-dropdown-author .filter-dropdown .filter-dropdown-item', text: text).click - end + let(:filter_dropdown) { find("#{js_dropdown_author} .filter-dropdown") } before do project.add_maintainer(user) - project.add_maintainer(user_john) - project.add_maintainer(user_jacob) sign_in(user) create(:issue, project: project) @@ -40,113 +19,23 @@ describe 'Dropdown author', :js do end describe 'behavior' do - it 'opens when the search bar has author:' do - filtered_search.set('author:') - - expect(page).to have_css(js_dropdown_author, visible: true) - end - - it 'closes when the search bar is unfocused' do - find('body').click - - expect(page).to have_css(js_dropdown_author, visible: false) - end - - it 'shows loading indicator when opened' do - slow_requests do - filtered_search.set('author:') - - expect(page).to have_css('#js-dropdown-author .filter-dropdown-loading', visible: true) - end - end - - it 'hides loading indicator when loaded' do - send_keys_to_filtered_search('author:') - - expect(page).not_to have_css('#js-dropdown-author .filter-dropdown-loading') - end - it 'loads all the authors when opened' do - send_keys_to_filtered_search('author:') + input_filtered_search('author:', submit: false, extra_space: false) - expect(dropdown_author_size).to eq(4) + expect_filtered_search_dropdown_results(filter_dropdown, 2) end it 'shows current user at top of dropdown' do - send_keys_to_filtered_search('author:') + input_filtered_search('author:', submit: false, extra_space: false) - expect(first('#js-dropdown-author li')).to have_content(user.name) - end - end - - describe 'filtering' do - before do - filtered_search.set('author') - send_keys_to_filtered_search(':') - end - - it 'filters by name' do - send_keys_to_filtered_search('jac') - - expect(dropdown_author_size).to eq(1) - end - - it 'filters by case insensitive name' do - send_keys_to_filtered_search('Jac') - - expect(dropdown_author_size).to eq(1) - end - - it 'filters by username with symbol' do - send_keys_to_filtered_search('@oot') - - expect(dropdown_author_size).to eq(2) - end - - it 'filters by username without symbol' do - send_keys_to_filtered_search('oot') - - expect(dropdown_author_size).to eq(2) - end - - it 'filters by case insensitive username without symbol' do - send_keys_to_filtered_search('OOT') - - expect(dropdown_author_size).to eq(2) - end - end - - describe 'selecting from dropdown' do - before do - filtered_search.set('author') - send_keys_to_filtered_search(':') - end - - it 'fills in the author username when the author has not been filtered' do - click_author(user_jacob.name) - - wait_for_requests - - expect(page).to have_css(js_dropdown_author, visible: false) - expect_tokens([author_token(user_jacob.name)]) - expect_filtered_search_input_empty - end - - it 'fills in the author username when the author has been filtered' do - click_author(user.name) - - wait_for_requests - - expect(page).to have_css(js_dropdown_author, visible: false) - expect_tokens([author_token(user.name)]) - expect_filtered_search_input_empty + expect(filter_dropdown.first('.filter-dropdown-item')).to have_content(user.name) end end describe 'selecting from dropdown without Ajax call' do before do Gitlab::Testing::RequestBlockerMiddleware.block_requests! - filtered_search.set('author:') + input_filtered_search('author:', submit: false, extra_space: false) end after do @@ -154,55 +43,11 @@ describe 'Dropdown author', :js do end it 'selects current user' do - find('#js-dropdown-author .filter-dropdown-item', text: user.username).click + find("#{js_dropdown_author} .filter-dropdown-item", text: user.username).click expect(page).to have_css(js_dropdown_author, visible: false) expect_tokens([author_token(user.username)]) expect_filtered_search_input_empty end end - - describe 'input has existing content' do - it 'opens author dropdown with existing search term' do - filtered_search.set('searchTerm author:') - - expect(page).to have_css(js_dropdown_author, visible: true) - end - - it 'opens author dropdown with existing assignee' do - filtered_search.set('assignee:@user author:') - - expect(page).to have_css(js_dropdown_author, visible: true) - end - - it 'opens author dropdown with existing label' do - filtered_search.set('label:~bug author:') - - expect(page).to have_css(js_dropdown_author, visible: true) - end - - it 'opens author dropdown with existing milestone' do - filtered_search.set('milestone:%v1.0 author:') - - expect(page).to have_css(js_dropdown_author, visible: true) - end - end - - describe 'caching requests' do - it 'caches requests after the first load' do - filtered_search.set('author') - send_keys_to_filtered_search(':') - initial_size = dropdown_author_size - - expect(initial_size).to be > 0 - - new_user = create(:user) - project.add_maintainer(new_user) - find('.filtered-search-box .clear-search').click - filtered_search.set('author') - send_keys_to_filtered_search(':') - - expect(dropdown_author_size).to eq(initial_size) - end - end end diff --git a/spec/features/issues/filtered_search/dropdown_base_spec.rb b/spec/features/issues/filtered_search/dropdown_base_spec.rb new file mode 100644 index 00000000000..0a8d768fe49 --- /dev/null +++ b/spec/features/issues/filtered_search/dropdown_base_spec.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Dropdown base', :js do + include FilteredSearchHelpers + + let!(:project) { create(:project) } + let!(:user) { create(:user, name: 'administrator', username: 'root') } + let(:filtered_search) { find('.filtered-search') } + let(:js_dropdown_assignee) { '#js-dropdown-assignee' } + let(:filter_dropdown) { find("#{js_dropdown_assignee} .filter-dropdown") } + + def dropdown_assignee_size + filter_dropdown.all('.filter-dropdown-item').size + end + + before do + project.add_maintainer(user) + sign_in(user) + create(:issue, project: project) + + visit project_issues_path(project) + end + + describe 'behavior' do + it 'shows loading indicator when opened' do + slow_requests do + # We aren't using `input_filtered_search` because we want to see the loading indicator + filtered_search.set('assignee:') + + expect(page).to have_css("#{js_dropdown_assignee} .filter-dropdown-loading", visible: true) + end + end + + it 'hides loading indicator when loaded' do + input_filtered_search('assignee:', submit: false, extra_space: false) + + expect(find(js_dropdown_assignee)).not_to have_css('.filter-dropdown-loading') + end + end + + describe 'caching requests' do + it 'caches requests after the first load' do + input_filtered_search('assignee:', submit: false, extra_space: false) + initial_size = dropdown_assignee_size + + expect(initial_size).to be > 0 + + new_user = create(:user) + project.add_maintainer(new_user) + find('.filtered-search-box .clear-search').click + input_filtered_search('assignee:', submit: false, extra_space: false) + + expect(dropdown_assignee_size).to eq(initial_size) + end + end +end diff --git a/spec/features/issues/filtered_search/dropdown_emoji_spec.rb b/spec/features/issues/filtered_search/dropdown_emoji_spec.rb index 7ec3d215fb1..324f39cbd2c 100644 --- a/spec/features/issues/filtered_search/dropdown_emoji_spec.rb +++ b/spec/features/issues/filtered_search/dropdown_emoji_spec.rb @@ -11,30 +11,13 @@ describe 'Dropdown emoji', :js do let!(:award_emoji_star) { create(:award_emoji, name: 'star', user: user, awardable: issue) } let(:filtered_search) { find('.filtered-search') } let(:js_dropdown_emoji) { '#js-dropdown-my-reaction' } - - def send_keys_to_filtered_search(input) - input.split("").each do |i| - filtered_search.send_keys(i) - end - - sleep 0.5 - wait_for_requests - end - - def dropdown_emoji_size - all('gl-emoji[data-name]').size - end - - def click_emoji(text) - find('#js-dropdown-my-reaction .filter-dropdown .filter-dropdown-item', text: text).click - end + let(:filter_dropdown) { find("#{js_dropdown_emoji} .filter-dropdown") } before do project.add_maintainer(user) create_list(:award_emoji, 2, user: user, name: 'thumbsup') create_list(:award_emoji, 1, user: user, name: 'thumbsdown') create_list(:award_emoji, 3, user: user, name: 'star') - create_list(:award_emoji, 1, user: user, name: 'tea') end context 'when user not logged in' do @@ -65,137 +48,16 @@ describe 'Dropdown emoji', :js do expect(page).to have_css(js_dropdown_emoji, visible: true) end - it 'closes when the search bar is unfocused' do - find('body').click - - expect(page).to have_css(js_dropdown_emoji, visible: false) - end - - it 'shows loading indicator when opened' do - slow_requests do - filtered_search.set('my-reaction:') - - expect(page).to have_css('#js-dropdown-my-reaction .filter-dropdown-loading', visible: true) - end - end - - it 'hides loading indicator when loaded' do - send_keys_to_filtered_search('my-reaction:') - - expect(page).not_to have_css('#js-dropdown-my-reaction .filter-dropdown-loading') - end - it 'loads all the emojis when opened' do - send_keys_to_filtered_search('my-reaction:') + input_filtered_search('my-reaction:', submit: false, extra_space: false) - expect(dropdown_emoji_size).to eq(4) + expect_filtered_search_dropdown_results(filter_dropdown, 3) end it 'shows the most populated emoji at top of dropdown' do - send_keys_to_filtered_search('my-reaction:') - - expect(first('#js-dropdown-my-reaction .filter-dropdown li')).to have_content(award_emoji_star.name) - end - end - - describe 'filtering' do - before do - filtered_search.set('my-reaction') - send_keys_to_filtered_search(':') - end - - it 'filters by name' do - send_keys_to_filtered_search('up') - - expect(dropdown_emoji_size).to eq(1) - end - - it 'filters by case insensitive name' do - send_keys_to_filtered_search('Up') - - expect(dropdown_emoji_size).to eq(1) - end - end - - describe 'selecting from dropdown' do - before do - filtered_search.set('my-reaction') - send_keys_to_filtered_search(':') - end - - it 'selects `None`' do - find('#js-dropdown-my-reaction .filter-dropdown-item', text: 'None').click - - expect(page).to have_css(js_dropdown_emoji, visible: false) - expect_tokens([reaction_token('None', false)]) - expect_filtered_search_input_empty - end - - it 'selects `Any`' do - find('#js-dropdown-my-reaction .filter-dropdown-item', text: 'Any').click - - expect(page).to have_css(js_dropdown_emoji, visible: false) - expect_tokens([reaction_token('Any', false)]) - expect_filtered_search_input_empty - end - - it 'fills in the my-reaction name' do - click_emoji('thumbsup') - - wait_for_requests - - expect(page).to have_css(js_dropdown_emoji, visible: false) - expect_tokens([reaction_token('thumbsup')]) - expect_filtered_search_input_empty - end - end - - describe 'input has existing content' do - it 'opens my-reaction dropdown with existing search term' do - filtered_search.set('searchTerm my-reaction:') - - expect(page).to have_css(js_dropdown_emoji, visible: true) - end - - it 'opens my-reaction dropdown with existing assignee' do - filtered_search.set('assignee:@user my-reaction:') - - expect(page).to have_css(js_dropdown_emoji, visible: true) - end - - it 'opens my-reaction dropdown with existing label' do - filtered_search.set('label:~bug my-reaction:') - - expect(page).to have_css(js_dropdown_emoji, visible: true) - end - - it 'opens my-reaction dropdown with existing milestone' do - filtered_search.set('milestone:%v1.0 my-reaction:') - - expect(page).to have_css(js_dropdown_emoji, visible: true) - end - - it 'opens my-reaction dropdown with existing my-reaction' do - filtered_search.set('my-reaction:star my-reaction:') - - expect(page).to have_css(js_dropdown_emoji, visible: true) - end - end - - describe 'caching requests' do - it 'caches requests after the first load' do - filtered_search.set('my-reaction') - send_keys_to_filtered_search(':') - initial_size = dropdown_emoji_size - - expect(initial_size).to be > 0 - - create_list(:award_emoji, 1, user: user, name: 'smile') - find('.filtered-search-box .clear-search').click - filtered_search.set('my-reaction') - send_keys_to_filtered_search(':') + input_filtered_search('my-reaction:', submit: false, extra_space: false) - expect(dropdown_emoji_size).to eq(initial_size) + expect(first("#{js_dropdown_emoji} .filter-dropdown li")).to have_content(award_emoji_star.name) end end end diff --git a/spec/features/issues/filtered_search/dropdown_hint_spec.rb b/spec/features/issues/filtered_search/dropdown_hint_spec.rb index bb57d69148b..5994f3a7902 100644 --- a/spec/features/issues/filtered_search/dropdown_hint_spec.rb +++ b/spec/features/issues/filtered_search/dropdown_hint_spec.rb @@ -46,9 +46,7 @@ describe 'Dropdown hint', :js do it 'opens when the search bar is first focused' do expect(page).to have_css(js_dropdown_hint, visible: true) - end - it 'closes when the search bar is unfocused' do find('body').click expect(page).to have_css(js_dropdown_hint, visible: false) @@ -77,7 +75,7 @@ describe 'Dropdown hint', :js do filtered_search.click end - it 'opens the author dropdown when you click on author' do + it 'opens the token dropdown when you click on it' do click_hint('author') expect(page).to have_css(js_dropdown_hint, visible: false) @@ -85,116 +83,10 @@ describe 'Dropdown hint', :js do expect_tokens([{ name: 'Author' }]) expect_filtered_search_input_empty end - - it 'opens the assignee dropdown when you click on assignee' do - click_hint('assignee') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-assignee', visible: true) - expect_tokens([{ name: 'Assignee' }]) - expect_filtered_search_input_empty - end - - it 'opens the milestone dropdown when you click on milestone' do - click_hint('milestone') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-milestone', visible: true) - expect_tokens([{ name: 'Milestone' }]) - expect_filtered_search_input_empty - end - - it 'opens the release dropdown when you click on release' do - click_hint('release') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-release', visible: true) - expect_tokens([{ name: 'Release' }]) - expect_filtered_search_input_empty - end - - it 'opens the label dropdown when you click on label' do - click_hint('label') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-label', visible: true) - expect_tokens([{ name: 'Label' }]) - expect_filtered_search_input_empty - end - - it 'opens the emoji dropdown when you click on my-reaction' do - click_hint('my-reaction') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-my-reaction', visible: true) - expect_tokens([{ name: 'My-reaction' }]) - expect_filtered_search_input_empty - end - - it 'opens the yes-no dropdown when you click on confidential' do - click_hint('confidential') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-confidential', visible: true) - expect_tokens([{ name: 'Confidential' }]) - expect_filtered_search_input_empty - end - end - - describe 'selecting from dropdown with some input' do - it 'opens the author dropdown when you click on author' do - filtered_search.set('auth') - click_hint('author') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-author', visible: true) - expect_tokens([{ name: 'Author' }]) - expect_filtered_search_input_empty - end - - it 'opens the assignee dropdown when you click on assignee' do - filtered_search.set('assign') - click_hint('assignee') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-assignee', visible: true) - expect_tokens([{ name: 'Assignee' }]) - expect_filtered_search_input_empty - end - - it 'opens the milestone dropdown when you click on milestone' do - filtered_search.set('mile') - click_hint('milestone') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-milestone', visible: true) - expect_tokens([{ name: 'Milestone' }]) - expect_filtered_search_input_empty - end - - it 'opens the label dropdown when you click on label' do - filtered_search.set('lab') - click_hint('label') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-label', visible: true) - expect_tokens([{ name: 'Label' }]) - expect_filtered_search_input_empty - end - - it 'opens the emoji dropdown when you click on my-reaction' do - filtered_search.set('my') - click_hint('my-reaction') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-my-reaction', visible: true) - expect_tokens([{ name: 'My-reaction' }]) - expect_filtered_search_input_empty - end end describe 'reselecting from dropdown' do - it 'reuses existing author text' do + it 'reuses existing token text' do filtered_search.send_keys('author:') filtered_search.send_keys(:backspace) filtered_search.send_keys(:backspace) @@ -203,63 +95,6 @@ describe 'Dropdown hint', :js do expect_tokens([{ name: 'Author' }]) expect_filtered_search_input_empty end - - it 'reuses existing assignee text' do - filtered_search.send_keys('assignee:') - filtered_search.send_keys(:backspace) - filtered_search.send_keys(:backspace) - click_hint('assignee') - - expect_tokens([{ name: 'Assignee' }]) - expect_filtered_search_input_empty - end - - it 'reuses existing milestone text' do - filtered_search.send_keys('milestone:') - filtered_search.send_keys(:backspace) - filtered_search.send_keys(:backspace) - click_hint('milestone') - - expect_tokens([{ name: 'Milestone' }]) - expect_filtered_search_input_empty - end - - it 'reuses existing label text' do - filtered_search.send_keys('label:') - filtered_search.send_keys(:backspace) - filtered_search.send_keys(:backspace) - click_hint('label') - - expect_tokens([{ name: 'Label' }]) - expect_filtered_search_input_empty - end - - it 'reuses existing emoji text' do - filtered_search.send_keys('my-reaction:') - filtered_search.send_keys(:backspace) - filtered_search.send_keys(:backspace) - click_hint('my-reaction') - - expect_tokens([{ name: 'My-reaction' }]) - expect_filtered_search_input_empty - end - end - end - - context 'merge request page' do - before do - sign_in(user) - visit project_merge_requests_path(project) - filtered_search.click - end - - it 'shows the WIP menu item and opens the WIP options dropdown' do - click_hint('wip') - - expect(page).to have_css(js_dropdown_hint, visible: false) - expect(page).to have_css('#js-dropdown-wip', visible: true) - expect_tokens([{ name: 'WIP' }]) - expect_filtered_search_input_empty end end end diff --git a/spec/features/issues/filtered_search/dropdown_label_spec.rb b/spec/features/issues/filtered_search/dropdown_label_spec.rb index f7f9f0de4db..45112b01eac 100644 --- a/spec/features/issues/filtered_search/dropdown_label_spec.rb +++ b/spec/features/issues/filtered_search/dropdown_label_spec.rb @@ -8,31 +8,7 @@ describe 'Dropdown label', :js do let(:project) { create(:project) } let(:user) { create(:user) } let(:filtered_search) { find('.filtered-search') } - let(:js_dropdown_label) { '#js-dropdown-label' } - let(:filter_dropdown) { find("#{js_dropdown_label} .filter-dropdown") } - - shared_context 'with labels' do - let!(:bug_label) { create(:label, project: project, title: 'bug-label') } - let!(:uppercase_label) { create(:label, project: project, title: 'BUG-LABEL') } - let!(:two_words_label) { create(:label, project: project, title: 'High Priority') } - let!(:wont_fix_label) { create(:label, project: project, title: 'Won"t Fix') } - let!(:wont_fix_single_label) { create(:label, project: project, title: 'Won\'t Fix') } - let!(:special_label) { create(:label, project: project, title: '!@#$%^+&*()') } - let!(:long_label) { create(:label, project: project, title: 'this is a very long title this is a very long title this is a very long title this is a very long title this is a very long title') } - end - - def search_for_label(label) - init_label_search - filtered_search.send_keys(label) - end - - def click_label(text) - filter_dropdown.find('.filter-dropdown-item', text: text).click - end - - def clear_search_field - find('.filtered-search-box .clear-search').click - end + let(:filter_dropdown) { find('#js-dropdown-label .filter-dropdown') } before do project.add_maintainer(user) @@ -42,267 +18,12 @@ describe 'Dropdown label', :js do visit project_issues_path(project) end - describe 'keyboard navigation' do - it 'selects label' do - bug_label = create(:label, project: project, title: 'bug-label') - init_label_search - - # navigate to the bug_label option and selects it - filtered_search.native.send_keys(:down, :down, :down, :enter) - - expect_tokens([label_token(bug_label.title)]) - expect_filtered_search_input_empty - end - end - describe 'behavior' do - it 'opens when the search bar has label:' do - filtered_search.set('label:') - - expect(page).to have_css(js_dropdown_label) - end - - it 'closes when the search bar is unfocused' do - find('body').click - - expect(page).not_to have_css(js_dropdown_label) - end - - it 'shows loading indicator when opened and hides it when loaded' do - slow_requests do - filtered_search.set('label:') - - expect(page).to have_css("#{js_dropdown_label} .filter-dropdown-loading", visible: true) - end - expect(find(js_dropdown_label)).not_to have_css('.filter-dropdown-loading') - end - it 'loads all the labels when opened' do - bug_label = create(:label, project: project, title: 'bug-label') - filtered_search.set('label:') - - expect(filter_dropdown).to have_content(bug_label.title) - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) - end - end - - describe 'filtering' do - include_context 'with labels' - - before do - init_label_search - end - - it 'filters by case-insensitive name with or without symbol' do - filtered_search.send_keys('b') - - expect(filter_dropdown.find('.filter-dropdown-item', text: bug_label.title)).to be_visible - expect(filter_dropdown.find('.filter-dropdown-item', text: uppercase_label.title)).to be_visible - - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 2) - - clear_search_field - init_label_search - - filtered_search.send_keys('~bu') - - expect(filter_dropdown.find('.filter-dropdown-item', text: bug_label.title)).to be_visible - expect(filter_dropdown.find('.filter-dropdown-item', text: uppercase_label.title)).to be_visible - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 2) - end - - it 'filters by multiple words with or without symbol' do - filtered_search.send_keys('Hig') - - expect(filter_dropdown.find('.filter-dropdown-item', text: two_words_label.title)).to be_visible - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) - - clear_search_field - init_label_search - - filtered_search.send_keys('~Hig') - - expect(filter_dropdown.find('.filter-dropdown-item', text: two_words_label.title)).to be_visible - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) - end - - it 'filters by multiple words containing single quotes with or without symbol' do - filtered_search.send_keys('won\'t') - - expect(filter_dropdown.find('.filter-dropdown-item', text: wont_fix_single_label.title)).to be_visible - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) - - clear_search_field - init_label_search - - filtered_search.send_keys('~won\'t') - - expect(filter_dropdown.find('.filter-dropdown-item', text: wont_fix_single_label.title)).to be_visible - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) - end - - it 'filters by multiple words containing double quotes with or without symbol' do - filtered_search.send_keys('won"t') - - expect(filter_dropdown.find('.filter-dropdown-item', text: wont_fix_label.title)).to be_visible - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) - - clear_search_field - init_label_search - - filtered_search.send_keys('~won"t') - - expect(filter_dropdown.find('.filter-dropdown-item', text: wont_fix_label.title)).to be_visible - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) - end - - it 'filters by special characters with or without symbol' do - filtered_search.send_keys('^+') - - expect(filter_dropdown.find('.filter-dropdown-item', text: special_label.title)).to be_visible - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) - - clear_search_field - init_label_search - - filtered_search.send_keys('~^+') - - expect(filter_dropdown.find('.filter-dropdown-item', text: special_label.title)).to be_visible - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) - end - end - - describe 'selecting from dropdown' do - include_context 'with labels' - - before do - init_label_search - end - - it 'fills in the label name when the label has not been filled' do - click_label(bug_label.title) - - expect(page).not_to have_css(js_dropdown_label) - expect_tokens([label_token(bug_label.title)]) - expect_filtered_search_input_empty - end - - it 'fills in the label name when the label is partially filled' do - filtered_search.send_keys('bu') - click_label(bug_label.title) - - expect(page).not_to have_css(js_dropdown_label) - expect_tokens([label_token(bug_label.title)]) - expect_filtered_search_input_empty - end - - it 'fills in the label name that contains multiple words' do - click_label(two_words_label.title) - - expect(page).not_to have_css(js_dropdown_label) - expect_tokens([label_token("\"#{two_words_label.title}\"")]) - expect_filtered_search_input_empty - end - - it 'fills in the label name that contains multiple words and is very long' do - click_label(long_label.title) - - expect(page).not_to have_css(js_dropdown_label) - expect_tokens([label_token("\"#{long_label.title}\"")]) - expect_filtered_search_input_empty - end - - it 'fills in the label name that contains double quotes' do - click_label(wont_fix_label.title) - - expect(page).not_to have_css(js_dropdown_label) - expect_tokens([label_token("'#{wont_fix_label.title}'")]) - expect_filtered_search_input_empty - end - - it 'fills in the label name with the correct capitalization' do - click_label(uppercase_label.title) - - expect(page).not_to have_css(js_dropdown_label) - expect_tokens([label_token(uppercase_label.title)]) - expect_filtered_search_input_empty - end - - it 'fills in the label name with special characters' do - click_label(special_label.title) - - expect(page).not_to have_css(js_dropdown_label) - expect_tokens([label_token(special_label.title)]) - expect_filtered_search_input_empty - end - - it 'selects `no label`' do - find("#{js_dropdown_label} .filter-dropdown-item", text: 'None').click - - expect(page).not_to have_css(js_dropdown_label) - expect_tokens([label_token('None', false)]) - expect_filtered_search_input_empty - end - - it 'selects `any label`' do - find("#{js_dropdown_label} .filter-dropdown-item", text: 'Any').click - - expect(page).not_to have_css(js_dropdown_label) - expect_tokens([label_token('Any', false)]) - expect_filtered_search_input_empty - end - end - - describe 'input has existing content' do - it 'opens label dropdown with existing search term' do - filtered_search.set('searchTerm label:') - - expect(page).to have_css(js_dropdown_label) - end - - it 'opens label dropdown with existing author' do - filtered_search.set('author:@person label:') - - expect(page).to have_css(js_dropdown_label) - end - - it 'opens label dropdown with existing assignee' do - filtered_search.set('assignee:@person label:') - - expect(page).to have_css(js_dropdown_label) - end - - it 'opens label dropdown with existing label' do - filtered_search.set('label:~urgent label:') - - expect(page).to have_css(js_dropdown_label) - end - - it 'opens label dropdown with existing milestone' do - filtered_search.set('milestone:%v2.0 label:') - - expect(page).to have_css(js_dropdown_label) - end - - it 'opens label dropdown with existing my-reaction' do - filtered_search.set('my-reaction:star label:') - - expect(page).to have_css(js_dropdown_label) - end - end - - describe 'caching requests' do - it 'caches requests after the first load' do create(:label, project: project, title: 'bug-label') - init_label_search - - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) - - create(:label, project: project) - clear_search_field - init_label_search + filtered_search.set('label:') - expect(filter_dropdown).to have_selector('.filter-dropdown-item', count: 1) + expect_filtered_search_dropdown_results(filter_dropdown, 1) end end end diff --git a/spec/features/issues/filtered_search/dropdown_milestone_spec.rb b/spec/features/issues/filtered_search/dropdown_milestone_spec.rb index 5272a970a60..2f18aa8abaa 100644 --- a/spec/features/issues/filtered_search/dropdown_milestone_spec.rb +++ b/spec/features/issues/filtered_search/dropdown_milestone_spec.rb @@ -9,26 +9,9 @@ describe 'Dropdown milestone', :js do let!(:user) { create(:user) } let!(:milestone) { create(:milestone, title: 'v1.0', project: project) } let!(:uppercase_milestone) { create(:milestone, title: 'CAP_MILESTONE', project: project) } - let!(:two_words_milestone) { create(:milestone, title: 'Future Plan', project: project) } - let!(:wont_fix_milestone) { create(:milestone, title: 'Won"t Fix', project: project) } - let!(:special_milestone) { create(:milestone, title: '!@#$%^&*(+)', project: project) } - let!(:long_milestone) { create(:milestone, title: 'this is a very long title this is a very long title this is a very long title this is a very long title this is a very long title', project: project) } let(:filtered_search) { find('.filtered-search') } - let(:js_dropdown_milestone) { '#js-dropdown-milestone' } - let(:filter_dropdown) { find("#{js_dropdown_milestone} .filter-dropdown") } - - def dropdown_milestone_size - filter_dropdown.all('.filter-dropdown-item').size - end - - def click_milestone(text) - find('#js-dropdown-milestone .filter-dropdown .filter-dropdown-item', text: text).click - end - - def click_static_milestone(text) - find('#js-dropdown-milestone .filter-dropdown-item', text: text).click - end + let(:filter_dropdown) { find('#js-dropdown-milestone .filter-dropdown') } before do project.add_maintainer(user) @@ -39,240 +22,12 @@ describe 'Dropdown milestone', :js do end describe 'behavior' do - context 'filters by "milestone:"' do - before do - filtered_search.set('milestone:') - end - - it 'opens when the search bar has milestone:' do - expect(page).to have_css(js_dropdown_milestone, visible: true) - end - - it 'closes when the search bar is unfocused' do - find('body').click - - expect(page).to have_css(js_dropdown_milestone, visible: false) - end - - it 'hides loading indicator when loaded' do - expect(find(js_dropdown_milestone)).not_to have_css('.filter-dropdown-loading') - end - - it 'loads all the milestones when opened' do - expect(filter_dropdown).to have_selector('.filter-dropdown .filter-dropdown-item', count: 6) - end - end - - it 'shows loading indicator when opened' do - slow_requests do - filtered_search.set('milestone:') - - expect(page).to have_css('#js-dropdown-milestone .filter-dropdown-loading', visible: true) - end - end - end - - describe 'filtering' do - before do - filtered_search.set('milestone:') - - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(milestone.title) - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(uppercase_milestone.title) - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(two_words_milestone.title) - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(wont_fix_milestone.title) - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(special_milestone.title) - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(long_milestone.title) - end - - it 'filters by name' do - filtered_search.send_keys('v1') - - expect(filter_dropdown).to have_selector('.filter-dropdown .filter-dropdown-item', count: 1) - end - - it 'filters by case insensitive name' do - filtered_search.send_keys('V1') - - expect(filter_dropdown).to have_selector('.filter-dropdown .filter-dropdown-item', count: 1) - end - - it 'filters by name with symbol' do - filtered_search.send_keys('%v1') - - expect(filter_dropdown).to have_selector('.filter-dropdown .filter-dropdown-item', count: 1) - end - - it 'filters by case insensitive name with symbol' do - filtered_search.send_keys('%V1') - - expect(filter_dropdown).to have_selector('.filter-dropdown .filter-dropdown-item', count: 1) - end - - it 'filters by special characters' do - filtered_search.send_keys('(+') - - expect(filter_dropdown).to have_selector('.filter-dropdown .filter-dropdown-item', count: 1) - end - - it 'filters by special characters with symbol' do - filtered_search.send_keys('%(+') - - expect(filter_dropdown).to have_selector('.filter-dropdown .filter-dropdown-item', count: 1) - end - end - - describe 'selecting from dropdown' do before do filtered_search.set('milestone:') - - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(milestone.title) - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(uppercase_milestone.title) - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(two_words_milestone.title) - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(wont_fix_milestone.title) - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(special_milestone.title) - expect(find("#{js_dropdown_milestone} .filter-dropdown")).to have_content(long_milestone.title) - end - - it 'fills in the milestone name when the milestone has not been filled' do - click_milestone(milestone.title) - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token(milestone.title)]) - expect_filtered_search_input_empty - end - - it 'fills in the milestone name when the milestone is partially filled', :quarantine do - filtered_search.send_keys('v') - click_milestone(milestone.title) - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token(milestone.title)]) - expect_filtered_search_input_empty - end - - it 'fills in the milestone name that contains multiple words' do - click_milestone(two_words_milestone.title) - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token("\"#{two_words_milestone.title}\"")]) - expect_filtered_search_input_empty - end - - it 'fills in the milestone name that contains multiple words and is very long' do - click_milestone(long_milestone.title) - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token("\"#{long_milestone.title}\"")]) - expect_filtered_search_input_empty - end - - it 'fills in the milestone name that contains double quotes' do - click_milestone(wont_fix_milestone.title) - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token("'#{wont_fix_milestone.title}'")]) - expect_filtered_search_input_empty - end - - it 'fills in the milestone name with the correct capitalization' do - click_milestone(uppercase_milestone.title) - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token(uppercase_milestone.title)]) - expect_filtered_search_input_empty - end - - it 'fills in the milestone name with special characters' do - click_milestone(special_milestone.title) - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token(special_milestone.title)]) - expect_filtered_search_input_empty - end - - it 'selects `no milestone`' do - click_static_milestone('None') - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token('None', false)]) - expect_filtered_search_input_empty - end - - it 'selects `any milestone`' do - click_static_milestone('Any') - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token('Any', false)]) - expect_filtered_search_input_empty - end - - it 'selects `upcoming milestone`' do - click_static_milestone('Upcoming') - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token('Upcoming', false)]) - expect_filtered_search_input_empty - end - - it 'selects `started milestones`' do - click_static_milestone('Started') - - expect(page).to have_css(js_dropdown_milestone, visible: false) - expect_tokens([milestone_token('Started', false)]) - expect_filtered_search_input_empty end - end - - describe 'input has existing content' do - it 'opens milestone dropdown with existing search term' do - filtered_search.set('searchTerm milestone:') - - expect(page).to have_css(js_dropdown_milestone, visible: true) - end - - it 'opens milestone dropdown with existing author' do - filtered_search.set('author:@john milestone:') - - expect(page).to have_css(js_dropdown_milestone, visible: true) - end - - it 'opens milestone dropdown with existing assignee' do - filtered_search.set('assignee:@john milestone:') - - expect(page).to have_css(js_dropdown_milestone, visible: true) - end - - it 'opens milestone dropdown with existing label' do - filtered_search.set('label:~important milestone:') - - expect(page).to have_css(js_dropdown_milestone, visible: true) - end - - it 'opens milestone dropdown with existing milestone' do - filtered_search.set('milestone:%100 milestone:') - - expect(page).to have_css(js_dropdown_milestone, visible: true) - end - - it 'opens milestone dropdown with existing my-reaction' do - filtered_search.set('my-reaction:star milestone:') - - expect(page).to have_css(js_dropdown_milestone, visible: true) - end - end - - describe 'caching requests' do - it 'caches requests after the first load' do - filtered_search.set('milestone:') - initial_size = dropdown_milestone_size - - expect(initial_size).to be > 0 - - create(:milestone, project: project) - find('.filtered-search-box .clear-search').click - filtered_search.set('milestone:') - expect(dropdown_milestone_size).to eq(initial_size) + it 'loads all the milestones when opened' do + expect_filtered_search_dropdown_results(filter_dropdown, 2) end end end diff --git a/spec/features/issues/filtered_search/dropdown_release_spec.rb b/spec/features/issues/filtered_search/dropdown_release_spec.rb index eea7f2d7848..b9cce5c6998 100644 --- a/spec/features/issues/filtered_search/dropdown_release_spec.rb +++ b/spec/features/issues/filtered_search/dropdown_release_spec.rb @@ -10,13 +10,8 @@ describe 'Dropdown release', :js do let!(:release) { create(:release, tag: 'v1.0', project: project) } let!(:crazy_release) { create(:release, tag: '☺!/"#%&\'{}+,-.<>;=@]_`{|}🚀', project: project) } - def filtered_search - find('.filtered-search') - end - - def filter_dropdown - find('#js-dropdown-release .filter-dropdown') - end + let(:filtered_search) { find('.filtered-search') } + let(:filter_dropdown) { find('#js-dropdown-release .filter-dropdown') } before do project.add_maintainer(user) @@ -31,25 +26,8 @@ describe 'Dropdown release', :js do filtered_search.set('release:') end - def expect_results(count) - expect(filter_dropdown).to have_selector('.filter-dropdown .filter-dropdown-item', count: count) - end - it 'loads all the releases when opened' do - expect_results(2) - end - - it 'filters by tag name' do - filtered_search.send_keys("☺") - expect_results(1) - end - - it 'fills in the release name when the autocomplete hint is clicked' do - find('#js-dropdown-release .filter-dropdown-item', text: crazy_release.tag).click - - expect(page).to have_css('#js-dropdown-release', visible: false) - expect_tokens([release_token(crazy_release.tag)]) - expect_filtered_search_input_empty + expect_filtered_search_dropdown_results(filter_dropdown, 2) end end end diff --git a/spec/features/issues/filtered_search/filter_issues_spec.rb b/spec/features/issues/filtered_search/filter_issues_spec.rb index 8b5e7934ec1..12e010e293a 100644 --- a/spec/features/issues/filtered_search/filter_issues_spec.rb +++ b/spec/features/issues/filtered_search/filter_issues_spec.rb @@ -475,58 +475,6 @@ describe 'Filter issues', :js do end end - describe 'RSS feeds' do - let(:group) { create(:group) } - let(:project) { create(:project, group: group) } - - before do - group.add_developer(user) - end - - shared_examples 'updates atom feed link' do |type| - it "for #{type}" do - visit path - - link = find_link('Subscribe to RSS feed') - 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) - - expected = { - 'feed_token' => [user.feed_token], - 'milestone_title' => [milestone.title], - 'assignee_id' => [user.id.to_s] - } - - expect(params).to include(expected) - expect(auto_discovery_params).to include(expected) - end - end - - it_behaves_like 'updates atom feed link', :project do - let(:path) { project_issues_path(project, milestone_title: milestone.title, assignee_id: user.id) } - end - - it_behaves_like 'updates atom feed link', :group do - let(:path) { issues_group_path(group, milestone_title: milestone.title, assignee_id: user.id) } - end - - it 'updates atom feed link for group issues' do - visit issues_group_path(group, milestone_title: milestone.title, assignee_id: user.id) - link = find('.nav-controls a[title="Subscribe to RSS feed"]', visible: false) - 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('feed_token' => [user.feed_token]) - expect(params).to include('milestone_title' => [milestone.title]) - expect(params).to include('assignee_id' => [user.id.to_s]) - expect(auto_discovery_params).to include('feed_token' => [user.feed_token]) - expect(auto_discovery_params).to include('milestone_title' => [milestone.title]) - expect(auto_discovery_params).to include('assignee_id' => [user.id.to_s]) - end - end - context 'URL has a trailing slash' do before do visit "#{project_issues_path(project)}/" diff --git a/spec/features/issues/filtered_search/visual_tokens_spec.rb b/spec/features/issues/filtered_search/visual_tokens_spec.rb index f8035ef4b85..d1e976c3bca 100644 --- a/spec/features/issues/filtered_search/visual_tokens_spec.rb +++ b/spec/features/issues/filtered_search/visual_tokens_spec.rb @@ -34,7 +34,7 @@ describe 'Visual tokens', :js do visit project_issues_path(project) end - describe 'editing author token' do + describe 'editing a single token' do before do input_filtered_search('author:@root assignee:none', submit: false) first('.tokens-container .filtered-search-token').click @@ -42,9 +42,6 @@ describe 'Visual tokens', :js do it 'opens author dropdown' do expect(page).to have_css('#js-dropdown-author', visible: true) - end - - it 'makes value editable' do expect_filtered_search_input('@root') end @@ -77,139 +74,6 @@ describe 'Visual tokens', :js do end end - describe 'editing assignee token' do - before do - input_filtered_search('assignee:@root author:none', submit: false) - first('.tokens-container .filtered-search-token').double_click - end - - it 'opens assignee dropdown' do - expect(page).to have_css('#js-dropdown-assignee', visible: true) - end - - it 'makes value editable' do - expect_filtered_search_input('@root') - end - - it 'filters value' do - filtered_search.send_keys(:backspace) - - expect(page).to have_css('#js-dropdown-assignee .filter-dropdown .filter-dropdown-item', count: 1) - end - - it 'ends editing mode when document is clicked' do - find('#content-body').click - - expect_filtered_search_input_empty - expect(page).to have_css('#js-dropdown-assignee', visible: false) - end - - describe 'selecting static option from dropdown' do - before do - find("#js-dropdown-assignee").find('.filter-dropdown-item', text: 'None').click - end - - it 'changes value in visual token' do - expect(first('.tokens-container .filtered-search-token .value').text).to eq('None') - end - - it 'moves input to the right' do - expect(is_input_focused).to eq(true) - end - end - end - - describe 'editing milestone token' do - before do - input_filtered_search('milestone:%10.0 author:none', submit: false) - first('.tokens-container .filtered-search-token').click - first('#js-dropdown-milestone .filter-dropdown .filter-dropdown-item') - end - - it 'opens milestone dropdown' do - expect(filter_milestone_dropdown.find('.filter-dropdown-item', text: milestone_ten.title)).to be_visible - expect(filter_milestone_dropdown.find('.filter-dropdown-item', text: milestone_nine.title)).to be_visible - expect(page).to have_css('#js-dropdown-milestone', visible: true) - end - - it 'selects static option from dropdown' do - find("#js-dropdown-milestone").find('.filter-dropdown-item', text: 'Upcoming').click - - expect(first('.tokens-container .filtered-search-token .value').text).to eq('Upcoming') - expect(is_input_focused).to eq(true) - end - - it 'makes value editable' do - expect_filtered_search_input('%10.0') - end - - it 'filters value' do - filtered_search.send_keys(:backspace) - - expect(page).to have_css('#js-dropdown-milestone .filter-dropdown .filter-dropdown-item', count: 1) - end - - it 'ends editing mode when document is clicked' do - find('#content-body').click - - expect_filtered_search_input_empty - expect(page).to have_css('#js-dropdown-milestone', visible: false) - end - end - - describe 'editing label token' do - before do - input_filtered_search("label:~#{label.title} author:none", submit: false) - first('.tokens-container .filtered-search-token').double_click - first('#js-dropdown-label .filter-dropdown .filter-dropdown-item') - end - - it 'opens label dropdown' do - expect(filter_label_dropdown.find('.filter-dropdown-item', text: label.title)).to be_visible - expect(filter_label_dropdown.find('.filter-dropdown-item', text: cc_label.title)).to be_visible - expect(page).to have_css('#js-dropdown-label', visible: true) - end - - it 'selects option from dropdown' do - expect(filter_label_dropdown.find('.filter-dropdown-item', text: label.title)).to be_visible - expect(filter_label_dropdown.find('.filter-dropdown-item', text: cc_label.title)).to be_visible - - find("#js-dropdown-label").find('.filter-dropdown-item', text: cc_label.title).click - - expect(first('.tokens-container .filtered-search-token .value').text).to eq("~\"#{cc_label.title}\"") - expect(is_input_focused).to eq(true) - end - - it 'makes value editable' do - expect_filtered_search_input("~#{label.title}") - end - - it 'filters value' do - expect(filter_label_dropdown.find('.filter-dropdown-item', text: label.title)).to be_visible - expect(filter_label_dropdown.find('.filter-dropdown-item', text: cc_label.title)).to be_visible - - filtered_search.send_keys(:backspace) - - filter_label_dropdown.find('.filter-dropdown-item') - - expect(page.all('#js-dropdown-label .filter-dropdown .filter-dropdown-item').size).to eq(1) - end - - it 'ends editing mode when document is clicked' do - find('#content-body').click - - expect_filtered_search_input_empty - expect(page).to have_css('#js-dropdown-label', visible: false) - end - - it 'ends editing mode when scroll container is clicked' do - find('.scroll-container').click - - expect_filtered_search_input_empty - expect(page).to have_css('#js-dropdown-label', visible: false) - end - end - describe 'editing multiple tokens' do before do input_filtered_search('author:@root assignee:none', submit: false) @@ -232,10 +96,6 @@ describe 'Visual tokens', :js do first('.tokens-container .filtered-search-term').double_click end - it 'opens hint dropdown' do - expect(page).to have_css('#js-dropdown-hint', visible: true) - end - it 'opens author dropdown' do find('#js-dropdown-hint .filter-dropdown .filter-dropdown-item', text: 'author').click @@ -255,59 +115,21 @@ describe 'Visual tokens', :js do expect(page).to have_css('#js-dropdown-hint', visible: true) end - it 'opens author dropdown' do + it 'opens token dropdown' do filtered_search.send_keys('author:') - expect(page).to have_css('#js-dropdown-author', visible: true) - end - - it 'opens assignee dropdown' do - filtered_search.send_keys('assignee:') - expect(page).to have_css('#js-dropdown-assignee', visible: true) - end - it 'opens milestone dropdown' do - filtered_search.send_keys('milestone:') - expect(page).to have_css('#js-dropdown-milestone', visible: true) - end - - it 'opens label dropdown' do - filtered_search.send_keys('label:') - expect(page).to have_css('#js-dropdown-label', visible: true) + expect(page).to have_css('#js-dropdown-author', visible: true) end end - describe 'creates visual tokens' do - it 'creates author token' do + describe 'visual tokens' do + it 'creates visual token' do filtered_search.send_keys('author:@thomas ') token = page.all('.tokens-container .filtered-search-token')[1] expect(token.find('.name').text).to eq('Author') expect(token.find('.value').text).to eq('@thomas') end - - it 'creates assignee token' do - filtered_search.send_keys('assignee:@thomas ') - token = page.all('.tokens-container .filtered-search-token')[1] - - expect(token.find('.name').text).to eq('Assignee') - expect(token.find('.value').text).to eq('@thomas') - end - - it 'creates milestone token' do - filtered_search.send_keys('milestone:none ') - token = page.all('.tokens-container .filtered-search-token')[1] - - expect(token.find('.name').text).to eq('Milestone') - expect(token.find('.value').text).to eq('none') - end - - it 'creates label token' do - filtered_search.send_keys('label:~Backend ') - token = page.all('.tokens-container .filtered-search-token')[1] - - expect(token.find('.name').text).to eq('Label') - expect(token.find('.value').text).to eq('~Backend') - end end it 'does not tokenize incomplete token' do diff --git a/spec/features/issues/rss_spec.rb b/spec/features/issues/rss_spec.rb index d6a406f4f44..7577df3bc7d 100644 --- a/spec/features/issues/rss_spec.rb +++ b/spec/features/issues/rss_spec.rb @@ -3,11 +3,14 @@ require 'spec_helper' describe 'Project Issues RSS' do - let(:project) { create(:project, visibility_level: Gitlab::VisibilityLevel::PUBLIC) } + let!(:user) { create(:user) } + let(:group) { create(:group) } + let(:project) { create(:project, group: group, visibility_level: Gitlab::VisibilityLevel::PUBLIC) } let(:path) { project_issues_path(project) } before do - create(:issue, project: project) + create(:issue, project: project, assignees: [user]) + group.add_developer(user) end context 'when signed in' do @@ -31,4 +34,34 @@ describe 'Project Issues RSS' do it_behaves_like "it has an RSS button without a feed token" it_behaves_like "an autodiscoverable RSS feed without a feed token" end + + describe 'feeds' do + shared_examples 'updates atom feed link' do |type| + it "for #{type}" do + sign_in(user) + visit path + + link = find_link('Subscribe to RSS feed') + 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) + + expected = { + 'feed_token' => [user.feed_token], + 'assignee_id' => [user.id.to_s] + } + + expect(params).to include(expected) + expect(auto_discovery_params).to include(expected) + end + end + + it_behaves_like 'updates atom feed link', :project do + let(:path) { project_issues_path(project, assignee_id: user.id) } + end + + it_behaves_like 'updates atom feed link', :group do + let(:path) { issues_group_path(group, assignee_id: user.id) } + end + end end |