dropdown_hint_spec.rb 7.66 KB
Newer Older
Clement Ho's avatar
Clement Ho committed
1 2
require 'rails_helper'

3
describe 'Dropdown hint', :js do
4
  include FilteredSearchHelpers
Clement Ho's avatar
Clement Ho committed
5

6
  let!(:project) { create(:project, :public) }
Clement Ho's avatar
Clement Ho committed
7 8
  let!(:user) { create(:user) }
  let(:filtered_search) { find('.filtered-search') }
9 10 11 12 13
  let(:js_dropdown_hint) { '#js-dropdown-hint' }

  def click_hint(text)
    find('#js-dropdown-hint .filter-dropdown .filter-dropdown-item', text: text).click
  end
14

Clement Ho's avatar
Clement Ho committed
15
  before do
16
    project.add_maintainer(user)
Clement Ho's avatar
Clement Ho committed
17
    create(:issue, project: project)
18
    create(:merge_request, source_project: project, target_project: project)
Clement Ho's avatar
Clement Ho committed
19 20
  end

21
  context 'when user not logged in' do
Clement Ho's avatar
Clement Ho committed
22
    before do
23
      visit project_issues_path(project)
Clement Ho's avatar
Clement Ho committed
24 25
    end

26
    it 'does not exist my-reaction dropdown item' do
27
      expect(page).to have_css(js_dropdown_hint, visible: false)
28
      expect(page).not_to have_content('my-reaction')
Clement Ho's avatar
Clement Ho committed
29 30 31
    end
  end

32 33 34
  context 'when user logged in' do
    before do
      sign_in(user)
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
35

36
      visit project_issues_path(project)
Clement Ho's avatar
Clement Ho committed
37 38
    end

39 40 41 42 43
    describe 'behavior' do
      before do
        expect(page).to have_css(js_dropdown_hint, visible: false)
        filtered_search.click
      end
Clement Ho's avatar
Clement Ho committed
44

45 46 47
      it 'opens when the search bar is first focused' do
        expect(page).to have_css(js_dropdown_hint, visible: true)
      end
Clement Ho's avatar
Clement Ho committed
48

49 50
      it 'closes when the search bar is unfocused' do
        find('body').click
Clement Ho's avatar
Clement Ho committed
51

52 53
        expect(page).to have_css(js_dropdown_hint, visible: false)
      end
Clement Ho's avatar
Clement Ho committed
54 55
    end

56 57 58
    describe 'filtering' do
      it 'does not filter `Press Enter or click to search`' do
        filtered_search.set('randomtext')
Clement Ho's avatar
Clement Ho committed
59

60
        hint_dropdown = find(js_dropdown_hint)
Clement Ho's avatar
Clement Ho committed
61

62 63 64
        expect(hint_dropdown).to have_content('Press Enter or click to search')
        expect(hint_dropdown).to have_selector('.filter-dropdown .filter-dropdown-item', count: 0)
      end
Clement Ho's avatar
Clement Ho committed
65

66 67
      it 'filters with text' do
        filtered_search.set('a')
Clement Ho's avatar
Clement Ho committed
68

69
        expect(find(js_dropdown_hint)).to have_selector('.filter-dropdown .filter-dropdown-item', count: 4)
70
      end
Clement Ho's avatar
Clement Ho committed
71
    end
Clement Ho's avatar
Clement Ho committed
72

73 74 75 76
    describe 'selecting from dropdown with no input' do
      before do
        filtered_search.click
      end
Clement Ho's avatar
Clement Ho committed
77

78 79
      it 'opens the author dropdown when you click on author' do
        click_hint('author')
Clement Ho's avatar
Clement Ho committed
80

81 82 83 84 85
        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
Clement Ho's avatar
Clement Ho committed
86

87 88
      it 'opens the assignee dropdown when you click on assignee' do
        click_hint('assignee')
Clement Ho's avatar
Clement Ho committed
89

90 91 92 93 94
        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
Clement Ho's avatar
Clement Ho committed
95

96 97
      it 'opens the milestone dropdown when you click on milestone' do
        click_hint('milestone')
Clement Ho's avatar
Clement Ho committed
98

99 100 101 102 103
        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
104

105 106
      it 'opens the label dropdown when you click on label' do
        click_hint('label')
107

108 109 110 111 112
        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
113

114 115
      it 'opens the emoji dropdown when you click on my-reaction' do
        click_hint('my-reaction')
116

117 118 119 120 121
        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
122 123
    end

124 125 126 127
    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')
128

129 130 131 132 133
        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
134

135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
      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
        filtered_search.send_keys('author:')
        filtered_search.send_keys(:backspace)
180
        filtered_search.send_keys(:backspace)
181 182 183 184 185 186 187 188 189
        click_hint('author')

        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)
190
        filtered_search.send_keys(:backspace)
191 192 193 194 195 196 197 198 199
        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)
200
        filtered_search.send_keys(:backspace)
201 202 203 204 205 206 207 208 209
        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)
210
        filtered_search.send_keys(:backspace)
211 212 213 214 215 216 217 218 219
        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)
220
        filtered_search.send_keys(:backspace)
221 222 223 224 225
        click_hint('my-reaction')

        expect_tokens([{ name: 'my-reaction' }])
        expect_filtered_search_input_empty
      end
Clement Ho's avatar
Clement Ho committed
226 227
    end
  end
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244

  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
Clement Ho's avatar
Clement Ho committed
245
end