diff --git a/app/controllers/solr_search_controller.rb b/app/controllers/solr_search_controller.rb
index ac354d89..a3179fa8 100644
--- a/app/controllers/solr_search_controller.rb
+++ b/app/controllers/solr_search_controller.rb
@@ -1,7 +1,9 @@
class SolrSearchController < ApplicationController
before_action :search_for_dataset, only: [:search]
- def search; end
+ def search
+ @sort = params["sort"]
+ end
private
diff --git a/app/services/search/solr.rb b/app/services/search/solr.rb
index 503714a8..73691956 100644
--- a/app/services/search/solr.rb
+++ b/app/services/search/solr.rb
@@ -3,17 +3,21 @@ class Solr
def self.search(params)
query_param = params.fetch("q", "").squish
page = params["page"]
+ sort_param = params["sort"]
page && page.to_i.positive? ? page.to_i : 1
solr_client = client
query = "*:*" if query_param.empty?
+ sort_query = "metadata_modified desc" if sort_param == "recent"
+
solr_client.get "select", params: {
q: query,
start: page,
rows: 20,
fl: field_list,
+ sort: sort_query,
}
end
diff --git a/app/views/solr_search/search.html.erb b/app/views/solr_search/search.html.erb
index 9f6f33eb..2e242a66 100644
--- a/app/views/solr_search/search.html.erb
+++ b/app/views/solr_search/search.html.erb
@@ -25,6 +25,7 @@
+ <%= render '/search/sort' if @num_results > 1 %>
<%= number_with_delimiter(@num_results) %>
<%= t('.result').pluralize(@num_results) %> <%= t('.found') %>
diff --git a/spec/features/solr_search_page_spec.rb b/spec/features/solr_search_page_spec.rb
index 3ced8d1f..b6386a39 100644
--- a/spec/features/solr_search_page_spec.rb
+++ b/spec/features/solr_search_page_spec.rb
@@ -3,43 +3,66 @@
RSpec.describe "Solr Search page", type: :feature do
let(:results) { File.read(Rails.root.join("spec/fixtures/solr_response.json").to_s) }
- before do
- allow(Search::Solr).to receive(:search).and_return(JSON.parse(results))
- end
+ describe "Default search page behaviour" do
+ before do
+ allow(Search::Solr).to receive(:search).and_return(JSON.parse(results))
+ end
- scenario "Displays search heading" do
- visit "/search/solr"
- expect(page).to have_css("h1", text: "Search results")
- end
+ scenario "Displays search heading" do
+ visit "/search/solr"
+ expect(page).to have_css("h1", text: "Search results")
+ end
- scenario "Displays search box" do
- visit "/search/solr"
- expect(page).to have_content("Search data.gov.uk")
- end
+ scenario "Displays search box" do
+ visit "/search/solr"
+ expect(page).to have_content("Search data.gov.uk")
+ end
- scenario "Displays search results" do
- visit "/search/solr"
- expect(page).to have_content("2 results found")
- end
+ scenario "Displays search results" do
+ visit "/search/solr"
+ expect(page).to have_content("2 results found")
+ end
- scenario "Displays the title for each search result" do
- visit "/search/solr"
- expect(page).to have_css("h2", text: "A very interesting dataset")
- expect(page).to have_css("h2", text: "A dataset with additional inspire metadata")
- end
+ scenario "Displays the title for each search result" do
+ visit "/search/solr"
+ expect(page).to have_css("h2", text: "A very interesting dataset")
+ expect(page).to have_css("h2", text: "A dataset with additional inspire metadata")
+ end
- scenario "Displays the publisher for each search result" do
- visit "/search/solr"
- results = all(".published_by")
- expect(results.length).to be(2)
- expect(results[0]).to have_content "Ministry of Housing, Communities and Local Government"
- expect(results[1]).to have_content "Mole Valley District Council"
+ scenario "Displays the publisher for each search result" do
+ visit "/search/solr"
+ results = all(".published_by")
+ expect(results.length).to be(2)
+ expect(results[0]).to have_content "Ministry of Housing, Communities and Local Government"
+ expect(results[1]).to have_content "Mole Valley District Council"
+ end
+
+ scenario "Displays the last updated for each search result" do
+ visit "/search/solr"
+ expect(page).to have_content("Last updated", count: 2)
+ expect(page).to have_content("30 June 2017")
+ expect(page).to have_content("17 August 2018")
+ end
+
+ scenario "Results are sorted by best match" do
+ visit "/search/solr"
+ expect(page).to have_select("sort", selected: "Best match")
+ end
end
- scenario "Displays the last updated for each search result" do
- visit "/search/solr"
- expect(page).to have_content("Last updated", count: 2)
- expect(page).to have_content("30 June 2017")
- expect(page).to have_content("17 August 2018")
+ describe "When a user filters the results" do
+ before do
+ allow(Search::Solr).to receive(:search).and_return(JSON.parse(results))
+ end
+
+ scenario "Results are sorted by best match" do
+ filtered_solr_search_for("Best match")
+ expect(page).to have_select("sort", selected: "Best match")
+ end
+
+ scenario "Results are sorted by most recent" do
+ filtered_solr_search_for("Most recent")
+ expect(page).to have_select("sort", selected: "Most recent")
+ end
end
end
diff --git a/spec/support/solr_dataset_helper.rb b/spec/support/solr_dataset_helper.rb
new file mode 100644
index 00000000..20359055
--- /dev/null
+++ b/spec/support/solr_dataset_helper.rb
@@ -0,0 +1,7 @@
+def filtered_solr_search_for(sort_method)
+ visit "/search/solr"
+ within "#main-content" do
+ select sort_method, from: "Sort by"
+ find(".gem-c-search__submit").click
+ end
+end