151 lines
5.5 KiB
Ruby
151 lines
5.5 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe BookmarkQuery do
|
|
let(:collection) { build_stubbed(:collection) }
|
|
let(:pseud) { build_stubbed(:pseud, user: user) }
|
|
let(:tag) { build_stubbed(:tag) }
|
|
let(:user) { build_stubbed(:user) }
|
|
|
|
def find_parent_filter(query_list)
|
|
query_list.find { |query| query.key? :has_parent }
|
|
end
|
|
|
|
it "allows you to perform a simple search" do
|
|
q = BookmarkQuery.new(bookmarkable_query: "space", bookmark_query: "unicorns")
|
|
search_body = q.generated_query
|
|
query = { query_string: { query: "unicorns", default_operator: "AND" } }
|
|
expect(search_body[:query][:bool][:must]).to include(query)
|
|
expect(search_body[:query][:bool][:must]).to include(
|
|
has_parent: {
|
|
parent_type: "bookmarkable",
|
|
query: { query_string: { query: "space", default_operator: "AND" } },
|
|
score: true
|
|
}
|
|
)
|
|
end
|
|
|
|
it "excludes private bookmarks by default" do
|
|
q = BookmarkQuery.new
|
|
expect(q.generated_query.dig(:query, :bool, :filter)).to include({ term: { private: "false" } })
|
|
end
|
|
|
|
it "excludes private bookmarks by default when a user is logged in" do
|
|
User.current_user = user
|
|
q = BookmarkQuery.new
|
|
expect(q.generated_query.dig(:query, :bool, :filter)).to include({ term: { private: "false" } })
|
|
end
|
|
|
|
it "includes private bookmarks when a user is logged in and looking at their own page" do
|
|
User.current_user = user
|
|
q = BookmarkQuery.new(parent: user)
|
|
expect(q.generated_query.dig(:query, :bool, :filter)).not_to include({ term: { private: "false" } })
|
|
end
|
|
|
|
it "excludes hidden bookmarks" do
|
|
q = BookmarkQuery.new
|
|
expect(q.generated_query.dig(:query, :bool, :filter)).to include({ term: { hidden_by_admin: "false" } })
|
|
end
|
|
|
|
context "with empty search terms" do
|
|
let(:query) { BookmarkQuery.new }
|
|
|
|
let(:excluded_parent_filter) do
|
|
find_parent_filter(query.generated_query.dig(:query, :bool, :must_not))
|
|
end
|
|
|
|
it "excludes bookmarks of hidden objects" do
|
|
expect(excluded_parent_filter.dig(:has_parent, :query, :bool, :should)).to \
|
|
include({ term: { hidden_by_admin: "true" } })
|
|
end
|
|
|
|
it "excludes bookmarks of drafts" do
|
|
expect(excluded_parent_filter.dig(:has_parent, :query, :bool, :should)).to \
|
|
include({ term: { posted: "false" } })
|
|
end
|
|
|
|
it "excludes restricted works when logged out" do
|
|
expect(excluded_parent_filter.dig(:has_parent, :query, :bool, :should)).to \
|
|
include({ term: { restricted: "true" } })
|
|
end
|
|
|
|
it "includes restricted works when logged in" do
|
|
User.current_user = user
|
|
expect(excluded_parent_filter.dig(:has_parent, :query, :bool, :should)).not_to \
|
|
include({ term: { restricted: "true" } })
|
|
end
|
|
end
|
|
|
|
it "allows you to filter for recs" do
|
|
q = BookmarkQuery.new(rec: true)
|
|
expect(q.generated_query.dig(:query, :bool, :filter)).to include({ term: { rec: "true" } })
|
|
end
|
|
|
|
it "allows you to filter for bookmarks with notes" do
|
|
q = BookmarkQuery.new(with_notes: true)
|
|
expect(q.generated_query.dig(:query, :bool, :filter)).to include({ term: { with_notes: "true" } })
|
|
end
|
|
|
|
it "allows you to filter for bookmarks by pseud" do
|
|
q = BookmarkQuery.new(parent: pseud)
|
|
expect(q.generated_query.dig(:query, :bool, :filter)).to include(terms: { pseud_id: [pseud.id] })
|
|
end
|
|
|
|
it "allows you to filter for bookmarks by user" do
|
|
q = BookmarkQuery.new(parent: user)
|
|
expect(q.generated_query.dig(:query, :bool, :filter)).to include({ term: { user_id: user.id } })
|
|
end
|
|
|
|
it "allows you to filter for bookmarks by bookmark tags" do
|
|
q = BookmarkQuery.new(tag_ids: [tag.id])
|
|
|
|
expect(q.generated_query.dig(:query, :bool, :filter)).to include({ term: { tag_ids: tag.id } })
|
|
end
|
|
|
|
it "allows you to filter for bookmarks by collection" do
|
|
q = BookmarkQuery.new(parent: collection)
|
|
expect(q.generated_query.dig(:query, :bool, :filter)).to include({ terms: { collection_ids: [collection.id] } })
|
|
end
|
|
|
|
context "when filtering on properties of the bookmarkable" do
|
|
it "allows you to filter for complete works" do
|
|
q = BookmarkQuery.new(complete: true)
|
|
parent = find_parent_filter(q.generated_query.dig(:query, :bool, :must))
|
|
expect(parent.dig(:has_parent, :query, :bool, :filter)).to \
|
|
include({ term: { complete: "true" } })
|
|
end
|
|
|
|
it "allows you to filter by bookmarkable tags" do
|
|
q = BookmarkQuery.new(parent: tag)
|
|
parent = find_parent_filter(q.generated_query.dig(:query, :bool, :must))
|
|
expect(parent.dig(:has_parent, :query, :bool, :filter)).to \
|
|
include({ term: { filter_ids: tag.id } })
|
|
end
|
|
|
|
it "allows you to filter by bookmarkable language" do
|
|
q = BookmarkQuery.new(language_id: "ig")
|
|
parent = find_parent_filter(q.generated_query.dig(:query, :bool, :must))
|
|
expect(parent.dig(:has_parent, :query, :bool, :filter)).to \
|
|
include({ term: { "language_id.keyword": "ig" } })
|
|
end
|
|
end
|
|
|
|
describe "a faceted query" do
|
|
let(:bookmark_query) { BookmarkQuery.new(faceted: true) }
|
|
let(:aggregations) { bookmark_query.generated_query[:aggs] }
|
|
|
|
it "includes aggregations for the bookmark tags" do
|
|
expect(aggregations[:tag]).to \
|
|
include({ terms: { field: "tag_ids" } })
|
|
end
|
|
|
|
Tag::FILTERS.each do |type|
|
|
it "includes #{type.underscore.humanize.downcase} aggregations for the bookmarkable" do
|
|
expect(aggregations[:bookmarkable]).to \
|
|
include({ parent: { type: "bookmark" } })
|
|
|
|
expect(aggregations.dig(:bookmarkable, :aggs, type.underscore)).to \
|
|
include({ terms: { field: "#{type.underscore}_ids" } })
|
|
end
|
|
end
|
|
end
|
|
end
|