mirror of
https://github.com/iv-org/invidious
synced 2024-11-13 22:53:34 +01:00
commit
fa4ce6b4e6
200
spec/invidious/search/query_spec.cr
Normal file
200
spec/invidious/search/query_spec.cr
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
require "../../../src/invidious/search/filters"
|
||||||
|
require "../../../src/invidious/search/query"
|
||||||
|
|
||||||
|
require "http/params"
|
||||||
|
require "spectator"
|
||||||
|
|
||||||
|
Spectator.configure do |config|
|
||||||
|
config.fail_blank
|
||||||
|
config.randomize
|
||||||
|
end
|
||||||
|
|
||||||
|
Spectator.describe Invidious::Search::Query do
|
||||||
|
describe Type::Regular do
|
||||||
|
# -------------------
|
||||||
|
# Query parsing
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
it "parses query with URL prameters (q)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=What+is+Love+10+hour&type=video&duration=long"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("What is Love 10 hour")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
type: Invidious::Search::Filters::Type::Video,
|
||||||
|
duration: Invidious::Search::Filters::Duration::Long
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses query with URL prameters (search_query)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("search_query=What+is+Love+10+hour&type=video&duration=long"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("What is Love 10 hour")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
type: Invidious::Search::Filters::Type::Video,
|
||||||
|
duration: Invidious::Search::Filters::Duration::Long
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses query with legacy filters (q)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=Nyan+cat+duration:long"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Nyan cat")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
duration: Invidious::Search::Filters::Duration::Long
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses query with legacy filters (search_query)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("search_query=Nyan+cat+duration:long"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Nyan cat")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
duration: Invidious::Search::Filters::Duration::Long
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses query with both URL params and legacy filters" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=Vamos+a+la+playa+duration:long&type=Video&date=year"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Vamos a la playa duration:long")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
type: Invidious::Search::Filters::Type::Video,
|
||||||
|
date: Invidious::Search::Filters::Date::Year
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Type switching
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
it "switches to channel search (URL param)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=thunderbolt+4&channel=UC0vBXGSyV14uvJ4hECDOl0Q"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Channel)
|
||||||
|
expect(query.channel).to eq("UC0vBXGSyV14uvJ4hECDOl0Q")
|
||||||
|
expect(query.text).to eq("thunderbolt 4")
|
||||||
|
expect(query.filters.default?).to be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "switches to channel search (legacy)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=channel%3AUCRPdsCVuH53rcbTcEkuY4uQ+rdna3"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Channel)
|
||||||
|
expect(query.channel).to eq("UCRPdsCVuH53rcbTcEkuY4uQ")
|
||||||
|
expect(query.text).to eq("rdna3")
|
||||||
|
expect(query.filters.default?).to be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "switches to subscriptions search" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=subscriptions:true+tunak+tunak+tun"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Subscriptions)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("tunak tunak tun")
|
||||||
|
expect(query.filters.default?).to be_true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe Type::Channel do
|
||||||
|
it "ignores extra parameters" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=Take+on+me+channel%3AUC12345679&type=video&date=year"),
|
||||||
|
Invidious::Search::Query::Type::Channel, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Channel)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Take on me")
|
||||||
|
expect(query.filters.default?).to be_true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe Type::Subscriptions do
|
||||||
|
it "works" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=Harlem+shake&type=video&date=year"),
|
||||||
|
Invidious::Search::Query::Type::Subscriptions, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Subscriptions)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Harlem shake")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
type: Invidious::Search::Filters::Type::Video,
|
||||||
|
date: Invidious::Search::Filters::Date::Year
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe Type::Playlist do
|
||||||
|
it "ignores extra parameters" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=Harlem+shake+type:video+date:year&channel=UC12345679"),
|
||||||
|
Invidious::Search::Query::Type::Playlist, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Playlist)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Harlem shake")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
type: Invidious::Search::Filters::Type::Video,
|
||||||
|
date: Invidious::Search::Filters::Date::Year
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -10,7 +10,7 @@ module Invidious::Search
|
|||||||
Playlist # "Add playlist item" search
|
Playlist # "Add playlist item" search
|
||||||
end
|
end
|
||||||
|
|
||||||
@type : Type = Type::Regular
|
getter type : Type = Type::Regular
|
||||||
|
|
||||||
@raw_query : String
|
@raw_query : String
|
||||||
@query : String = ""
|
@query : String = ""
|
||||||
@ -63,14 +63,17 @@ module Invidious::Search
|
|||||||
|
|
||||||
# Specific handling
|
# Specific handling
|
||||||
case @type
|
case @type
|
||||||
when .playlist?, .channel?
|
when .channel?
|
||||||
# In "add playlist item" mode, filters are parsed from the query
|
|
||||||
# string itself (legacy), and the channel is ignored.
|
|
||||||
#
|
|
||||||
# In "channel search" mode, filters are ignored, but we still parse
|
# In "channel search" mode, filters are ignored, but we still parse
|
||||||
# the query prevent transmission of legacy filters to youtube.
|
# the query prevent transmission of legacy filters to youtube.
|
||||||
#
|
#
|
||||||
@filters, @query, @channel, _ = Filters.from_legacy_filters(@raw_query || "")
|
_, _, @query, _ = Filters.from_legacy_filters(@raw_query)
|
||||||
|
#
|
||||||
|
when .playlist?
|
||||||
|
# In "add playlist item" mode, filters are parsed from the query
|
||||||
|
# string itself (legacy), and the channel is ignored.
|
||||||
|
#
|
||||||
|
@filters, _, @query, _ = Filters.from_legacy_filters(@raw_query)
|
||||||
#
|
#
|
||||||
when .subscriptions?, .regular?
|
when .subscriptions?, .regular?
|
||||||
if params["sp"]?
|
if params["sp"]?
|
||||||
@ -84,7 +87,7 @@ module Invidious::Search
|
|||||||
|
|
||||||
if @filters.default? && @raw_query.includes?(':')
|
if @filters.default? && @raw_query.includes?(':')
|
||||||
# Parse legacy filters from query
|
# Parse legacy filters from query
|
||||||
@filters, @query, @channel, subs = Filters.from_legacy_filters(@raw_query || "")
|
@filters, @channel, @query, subs = Filters.from_legacy_filters(@raw_query)
|
||||||
else
|
else
|
||||||
@query = @raw_query || ""
|
@query = @raw_query || ""
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user