# frozen_string_literal: true require 'rails_helper' require 'pp' RSpec.feature 'Basic search', type: :feature, elasticsearch: true do before(:each) do @papers = FactoryBot.create_list(:paper, 11) Paper.__elasticsearch__.refresh_index! end scenario 'It displays the search form' do visit search_path body: 'leipzig' expect(page).to have_content('Stadtratmonitor') expect(page).to have_field('paper_search_query') expect(page).to have_select('Typ') expect(page).to have_select('Einreicher') expect(page).to have_selector('label', text: 'Sortierung') expect(page).to have_field('paper_search_sort_by_date', type: 'radio') expect(page).to have_field('paper_search_sort_by_score', type: 'radio') end scenario 'With empty query displays all documents' do visit search_path body: 'leipzig' expect(page).to have_selector('ul#search_results') expect(page).to have_content("#{@papers.size} Dokumente in der Datenbank") end scenario 'Search results are paginated' do visit search_path body: 'leipzig' expect(page).to have_css('li.search-result', count: 10) expect(page).to have_css('div#pagination') within('div#pagination') do expect(page).to have_css('li', count: 4) # two pages + next + last expect(page).to have_css('li.current', text: '1') expect(page).to have_link('2') expect(page).to have_link('Weiter') expect(page).to have_link('Ende') end page.find('div#pagination').click_link('2') expect(page).to have_css('li.search-result', count: 1) within('div#pagination') do expect(page).to have_css('li.current', text: '2') end end scenario 'Search results have basic information' do visit search_path body: 'leipzig' paper = @papers.first resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(paper.name) resultSubEntry = resultEntry.find('li.current', match: :first) linkName = getLinkName(paper) expect(resultSubEntry).to have_link(linkName, href: paper.url) end def getLinkName(paper) dateStr = I18n.l(paper.published_at.to_date) originatorStr = (paper.originator.is_a?(Array) ? paper.originator.join(', ') : paper.originator) "#{dateStr}: #{paper.paper_type} von #{originatorStr}" end scenario 'Finds papers by name' do paper = FactoryBot.create(:paper, name: 'Opendata als default') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'Opendata' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(paper.name) resultSubEntry = resultEntry.find('li.current', match: :first) linkName = getLinkName(paper) expect(resultSubEntry).to have_link(linkName, href: paper.url) end scenario 'Finds papers by content' do paper = FactoryBot.create(:paper, name: 'Opendata als default', content: 'Alle Verwaltungsdokumente werden als Opendata veröffentlicht') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'Verwaltungsdokumente' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(paper.name) resultSubEntry = resultEntry.find('li.current', match: :first) linkName = getLinkName(paper) expect(resultSubEntry).to have_link(linkName, href: paper.url) end scenario 'Papers with common reference id in search result ordered by date' do mainPaper = FactoryBot.create(:paper, published_at: '2016-12-19T19:00:00', name: 'Opendata als default', reference: 'VI-0815') newPaper = FactoryBot.create(:paper, published_at: '2016-12-23T12:00:00', name: 'Opendata als optional', reference: 'VI-0815-ÄA-01') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'default' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(mainPaper.name) resultSubEntry1 = resultEntry.find('li.current', match: :first) linkName1 = getLinkName(mainPaper) expect(resultSubEntry1).to have_link(linkName1, href: mainPaper.url) resultSubEntries = resultEntry.find('ul').all('li') linkName2 = getLinkName(newPaper) expect(resultSubEntries[0]).to have_link(linkName2, href: newPaper.url) expect(resultSubEntries[1]).to have_link(linkName1, href: mainPaper.url) end scenario 'Papers with common reference id in search result ordered by ref' do mainPaper = FactoryBot.create(:paper, published_at: '2016-12-19T19:00:00', name: 'Opendata als default', reference: 'VI-0815') newPaper1 = FactoryBot.create(:paper, published_at: '2016-12-23T12:00:00', name: 'Opendata als optional', reference: 'VI-0815-ÄA-02') newPaper2 = FactoryBot.create(:paper, published_at: '2016-12-23T12:00:00', name: 'Opendata als optional', reference: 'VI-0815-ÄA-01') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'default' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) resultSubEntries = resultEntry.find('ul').all('li') linkName1 = getLinkName(newPaper1) expect(resultSubEntries[0]).to have_link(linkName1, href: newPaper1.url) linkName2 = getLinkName(newPaper2) expect(resultSubEntries[1]).to have_link(linkName2, href: newPaper2.url) linkName3 = getLinkName(mainPaper) expect(resultSubEntries[2]).to have_link(linkName3, href: mainPaper.url) end scenario 'Papers with common reference id handled also for missing prefix' do mainPaper = FactoryBot.create(:paper, published_at: '2016-12-19T19:00:00', name: 'Opendata als default', reference: 'VI-0815') newPaper1 = FactoryBot.create(:paper, published_at: '2016-12-23T12:00:00', name: 'Opendata als optional', reference: 'VI-0815-NF-01') newPaper1Change = FactoryBot.create(:paper, published_at: '2016-12-23T12:00:00', name: 'Opendata als nicht optional', reference: '-0815-NF-01-ÄA-01') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'default' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) resultSubEntries = resultEntry.find('ul').all('li') linkName1 = getLinkName(newPaper1) expect(resultSubEntries[0]).to have_link(linkName1, href: newPaper1.url) linkName2 = getLinkName(newPaper1Change) expect(resultSubEntries[1]).to have_link(linkName2, href: newPaper1Change.url) linkName3 = getLinkName(mainPaper) expect(resultSubEntries[2]).to have_link(linkName3, href: mainPaper.url) end scenario "Finds 'Testen' with search 'Test'" do paper = FactoryBot.create(:paper, name: 'Testen') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'Test' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(paper.name) end scenario "Finds 'Test' with search 'Testen'" do paper = FactoryBot.create(:paper, name: 'Test') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'Testen' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(paper.name) end scenario "Finds 'Fahrräderverleih' with search 'Fahrrad'" do paper = FactoryBot.create(:paper, name: 'Fahrräderverleih') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'Fahrrad' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(paper.name) end scenario "Finds 'Fahrräderverleih' with search 'Fahrräder'" do paper = FactoryBot.create(:paper, name: 'Fahrräderverleih') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'Fahrräder' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(paper.name) end scenario "Finds 'Fahrräderverleih' with search 'Verleih'" do paper = FactoryBot.create(:paper, name: 'Fahrräderverleih') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'Verleih' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(paper.name) end scenario "Finds 'Fahrräderverleih' with search 'Autoverleih'" do paper = FactoryBot.create(:paper, name: 'Fahrräderverleih') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'Autoverleih' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(paper.name) end scenario "Finds no 'Fahrrad' with search 'Rad'" do paper = FactoryBot.create(:paper, name: 'Fahrrad') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'Rad' } expect(page).to have_content('0 Dokumente in der Datenbank') end scenario 'Papers with reference id having slash is escaped' do mainPaper = FactoryBot.create(:paper, published_at: '2016-12-19T19:00:00', name: 'Opendata als default', reference: 'VI-00768/14') newPaper = FactoryBot.create(:paper, published_at: '2016-12-23T12:00:00', name: 'Opendata als optional', reference: 'VI-00768/14-ÄA-01') Paper.__elasticsearch__.refresh_index! visit search_path body: 'leipzig', paper_search: { query: 'default' } expect(page).to have_content('1 Dokument in der Datenbank') resultEntry = page.find('li.search-result', match: :first) expect(resultEntry).to have_content(mainPaper.name) resultSubEntry1 = resultEntry.find('li.current', match: :first) linkName1 = getLinkName(mainPaper) expect(resultSubEntry1).to have_link(linkName1, href: mainPaper.url) resultSubEntries = resultEntry.find('ul').all('li') linkName2 = getLinkName(newPaper) expect(resultSubEntries[0]).to have_link(linkName2, href: newPaper.url) expect(resultSubEntries[1]).to have_link(linkName1, href: mainPaper.url) end end