search_spec.rb 7.99 KB
Newer Older
randx's avatar
randx committed
1 2
require 'spec_helper'

3
describe "Search", feature: true  do
4
  include FilteredSearchHelpers
5

6
  let(:user) { create(:user) }
7
  let(:project) { create(:empty_project, namespace: user.namespace) }
8
  let!(:issue) { create(:issue, project: project, assignees: [user]) }
Phil Hughes's avatar
Phil Hughes committed
9
  let!(:issue2) { create(:issue, project: project, author: user) }
10

randx's avatar
randx committed
11
  before do
12 13
    login_with(user)
    project.team << [user, :reporter]
randx's avatar
randx committed
14
    visit search_path
15
  end
16

17
  it 'does not show top right search form' do
18 19
    expect(page).not_to have_selector('.search')
  end
20

21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
  context 'search filters', js: true do
    let(:group) { create(:group) }

    before do
      group.add_owner(user)
    end

    it 'shows group name after filtering' do
      find('.js-search-group-dropdown').click
      wait_for_ajax

      page.within '.search-holder' do
        click_link group.name
      end

      expect(find('.js-search-group-dropdown')).to have_content(group.name)
    end

    it 'shows project name after filtering' do
      page.within('.project-filter') do
        find('.js-search-project-dropdown').click
        wait_for_ajax

        click_link project.name_with_namespace
      end

      expect(find('.js-search-project-dropdown')).to have_content(project.name_with_namespace)
    end
  end

51 52 53 54 55 56 57 58
  describe 'searching for Projects' do
    it 'finds a project' do
      page.within '.search-holder' do
        fill_in "search", with: project.name[0..3]
        click_button "Search"
      end

      expect(page).to have_content project.name
59
    end
randx's avatar
randx committed
60 61
  end

62
  context 'search for comments' do
63
    context 'when comment belongs to a invalid commit' do
64
      let(:project) { create(:project, :repository) }
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
      let(:note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'Bug here') }

      before { note.update_attributes(commit_id: 12345678) }

      it 'finds comment' do
        visit namespace_project_path(project.namespace, project)

        page.within '.search' do
          fill_in 'search', with: note.note
          click_button 'Go'
        end

        click_link 'Comments'

        expect(page).to have_text("Commit deleted")
        expect(page).to have_text("12345678")
      end
    end

84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
    it 'finds a snippet' do
      snippet = create(:project_snippet, :private, project: project, author: user, title: 'Some title')
      note = create(:note,
                    noteable: snippet,
                    author: user,
                    note: 'Supercalifragilisticexpialidocious',
                    project: project)
      # Must visit project dashboard since global search won't search
      # everything (e.g. comments, snippets, etc.)
      visit namespace_project_path(project.namespace, project)

      page.within '.search' do
        fill_in 'search', with: note.note
        click_button 'Go'
      end

      click_link 'Comments'

      expect(page).to have_link(snippet.title)
    end
Valery Sizov's avatar
Valery Sizov committed
104 105

    it 'finds a commit' do
106
      project = create(:project, :repository) { |p| p.add_reporter(user) }
Valery Sizov's avatar
Valery Sizov committed
107 108 109 110 111 112 113 114 115 116 117 118 119
      visit namespace_project_path(project.namespace, project)

      page.within '.search' do
        fill_in 'search', with: 'add'
        click_button 'Go'
      end

      click_link "Commits"

      expect(page).to have_selector('.commit-row-description')
    end

    it 'finds a code' do
120
      project = create(:project, :repository) { |p| p.add_reporter(user) }
Valery Sizov's avatar
Valery Sizov committed
121 122 123
      visit namespace_project_path(project.namespace, project)

      page.within '.search' do
124
        fill_in 'search', with: 'application.js'
Valery Sizov's avatar
Valery Sizov committed
125 126 127 128 129 130
        click_button 'Go'
      end

      click_link "Code"

      expect(page).to have_selector('.file-content .code')
131 132

      expect(page).to have_selector("span.line[lang='javascript']")
Valery Sizov's avatar
Valery Sizov committed
133
    end
randx's avatar
randx committed
134
  end
135 136

  describe 'Right header search field', feature: true do
137 138 139 140 141 142 143 144 145 146
    it 'allows enter key to search', js: true do
      visit namespace_project_path(project.namespace, project)
      fill_in 'search', with: 'gitlab'
      find('#search').native.send_keys(:enter)

      page.within '.title' do
        expect(page).to have_content 'Search'
      end
    end

147 148 149 150 151
    describe 'Search in project page' do
      before do
        visit namespace_project_path(project.namespace, project)
      end

152
      it 'shows top right search form' do
153 154 155
        expect(page).to have_selector('#search')
      end

156
      it 'contains location badge in top right search form' do
157 158 159 160
        expect(page).to have_selector('.has-location-badge')
      end

      context 'clicking the search field', js: true do
161
        it 'shows category search dropdown' do
162 163
          page.find('#search').click

Fatih Acet's avatar
Fatih Acet committed
164
          expect(page).to have_selector('.dropdown-header', text: /#{project.name}/i)
165 166 167 168
        end
      end

      context 'click the links in the category search dropdown', js: true do
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
169 170
        let!(:merge_request) { create(:merge_request, source_project: project, author: user, assignee: user) }

171 172 173 174
        before do
          page.find('#search').click
        end

175
        it 'takes user to her issues page when issues assigned is clicked' do
176 177 178
          find('.dropdown-menu').click_link 'Issues assigned to me'
          sleep 2

Clement Ho's avatar
Clement Ho committed
179
          expect(page).to have_selector('.filtered-search')
180 181
          expect_tokens([{ name: 'assignee', value: "@#{user.username}" }])
          expect_filtered_search_input_empty
182 183
        end

184
        it 'takes user to her issues page when issues authored is clicked' do
185 186 187
          find('.dropdown-menu').click_link "Issues I've created"
          sleep 2

Clement Ho's avatar
Clement Ho committed
188
          expect(page).to have_selector('.filtered-search')
189 190
          expect_tokens([{ name: 'author', value: "@#{user.username}" }])
          expect_filtered_search_input_empty
191 192
        end

193
        it 'takes user to her MR page when MR assigned is clicked' do
194 195 196 197
          find('.dropdown-menu').click_link 'Merge requests assigned to me'
          sleep 2

          expect(page).to have_selector('.merge-requests-holder')
198 199
          expect_tokens([{ name: 'assignee', value: "@#{user.username}" }])
          expect_filtered_search_input_empty
200 201
        end

202
        it 'takes user to her MR page when MR authored is clicked' do
203 204 205 206
          find('.dropdown-menu').click_link "Merge requests I've created"
          sleep 2

          expect(page).to have_selector('.merge-requests-holder')
207 208
          expect_tokens([{ name: 'author', value: "@#{user.username}" }])
          expect_filtered_search_input_empty
209 210 211 212 213 214 215 216 217 218
        end
      end

      context 'entering text into the search field', js: true do
        before do
          page.within '.search-input-wrap' do
            fill_in "search", with: project.name[0..3]
          end
        end

219
        it 'does not display the category search dropdown' do
Fatih Acet's avatar
Fatih Acet committed
220
          expect(page).not_to have_selector('.dropdown-header', text: /#{project.name}/i)
221 222 223 224
        end
      end
    end
  end
225 226

  describe 'search for commits' do
227 228
    let(:project) { create(:project, :repository) }

229 230 231 232
    before do
      visit search_path(project_id: project.id)
    end

233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
    it 'redirects to commit page when search by sha and only commit found' do
      fill_in 'search', with: '6d394385cf567f80a8fd85055db1ab4c5295806f'

      click_button 'Search'

      expect(page).to have_current_path(namespace_project_commit_path(project.namespace, project, '6d394385cf567f80a8fd85055db1ab4c5295806f'))
    end

    it 'redirects to single commit regardless of query case' do
      fill_in 'search', with: '6D394385cf'

      click_button 'Search'

      expect(page).to have_current_path(namespace_project_commit_path(project.namespace, project, '6d394385cf567f80a8fd85055db1ab4c5295806f'))
    end

    it 'holds on /search page when the only commit is found by message' do
      create_commit('Message referencing another sha: "deadbeef" ', project, user, 'master')

      fill_in 'search', with: 'deadbeef'
      click_button 'Search'

      expect(page).to have_current_path('/search', only_path: true)
    end

258 259 260 261 262 263 264 265 266
    it 'shows multiple matching commits' do
      fill_in 'search', with: 'See merge request'

      click_button 'Search'
      click_link 'Commits'

      expect(page).to have_selector('.commit-row-description', count: 9)
    end
  end
randx's avatar
randx committed
267
end