user_searches_for_code_spec.rb 4.2 KB
Newer Older
1 2
# frozen_string_literal: true

3 4 5 6 7 8
require 'spec_helper'

describe 'User searches for code' do
  let(:user) { create(:user) }
  let(:project) { create(:project, :repository, namespace: user.namespace) }

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
  def submit_search(search, with_send_keys: false)
    page.within('.search') do
      field = find_field('search')
      field.fill_in(with: search)

      if with_send_keys
        field.send_keys(:enter)
      else
        click_button("Go")
      end
    end

    click_link('Code')
  end

24 25
  context 'when signed in' do
    before do
26
      project.add_maintainer(user)
27 28 29 30 31 32
      sign_in(user)
    end

    it 'finds a file' do
      visit(project_path(project))

33
      submit_search('application.js')
34 35 36 37 38 39 40 41

      expect(page).to have_selector('.file-content .code')
      expect(page).to have_selector("span.line[lang='javascript']")
    end

    context 'when on a project page', :js do
      before do
        visit(search_path)
42
        find('.js-search-project-dropdown').click
43 44

        page.within('.project-filter') do
45
          click_link(project.full_name)
46
        end
47
      end
48

49 50 51
      include_examples 'top right search form'

      it 'finds code' do
52
        fill_in('dashboard_search', with: 'rspec')
53
        find('.btn-search').click
54 55 56 57 58

        page.within('.results') do
          expect(find(:css, '.search-results')).to have_content('Update capybara, rspec-rails, poltergeist to recent versions')
        end
      end
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

      it 'search mutiple words with refs switching' do
        expected_result = 'Use `snake_case` for naming files'
        search = 'for naming files'

        fill_in('dashboard_search', with: search)
        find('.btn-search').click

        page.within('.results') do
          expect(find('.search-results')).to have_content(expected_result)
        end

        find('.js-project-refs-dropdown').click
        find('.dropdown-page-one .dropdown-content').click_link('v1.0.0')

        page.within('.results') do
          expect(find(:css, '.search-results')).to have_content(expected_result)
        end

        expect(find_field('dashboard_search').value).to eq(search)
      end
80
    end
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124

    context 'search code within refs', :js do
      let(:ref_name) { 'v1.0.0' }

      before do
        visit(project_tree_path(project, ref_name))
        submit_search('gitlab-grack', with_send_keys: true)
      end

      it 'shows ref switcher in code result summary' do
        expect(find('.js-project-refs-dropdown')).to have_text(ref_name)
      end
      it 'persists branch name across search' do
        find('.btn-search').click
        expect(find('.js-project-refs-dropdown')).to have_text(ref_name)
      end

      #  this example is use to test the desgine that the refs is not
      #  only repersent the branch as well as the tags.
      it 'ref swither list all the branchs and tags' do
        find('.js-project-refs-dropdown').click
        expect(find('.dropdown-page-one .dropdown-content')).to have_link('sha-starting-with-large-number')
        expect(find('.dropdown-page-one .dropdown-content')).to have_link('v1.0.0')
      end

      it 'search result changes when refs switched' do
        expect(find('.search-results')).not_to have_content('path = gitlab-grack')
        find('.js-project-refs-dropdown').click
        find('.dropdown-page-one .dropdown-content').click_link('master')
        expect(find('.search-results')).to have_content('path = gitlab-grack')
      end
    end

    it 'no ref switcher shown in issue result summary', :js do
      issue = create(:issue, title: 'test', project: project)
      visit(project_tree_path(project))
      submit_search('test', with_send_keys: true)
      expect(page).to have_selector('.js-project-refs-dropdown')
      page.within('.search-filter') do
        click_link('Issues')
      end
      expect(find(:css, '.search-results')).to have_link(issue.title)
      expect(page).not_to have_selector('.js-project-refs-dropdown')
    end
125 126 127 128 129 130 131 132 133 134
  end

  context 'when signed out' do
    let(:project) { create(:project, :public, :repository) }

    before do
      visit(project_path(project))
    end

    it 'finds code' do
135
      submit_search('rspec')
136 137 138 139 140 141 142

      page.within('.results') do
        expect(find(:css, '.search-results')).to have_content('Update capybara, rspec-rails, poltergeist to recent versions')
      end
    end
  end
end