otwarchive-symphonyarchive/spec/models/search/bookmark_query_spec.rb

152 lines
5.5 KiB
Ruby
Raw Permalink Normal View History

2026-03-11 22:22:11 +00:00
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