summaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/invidious/search/iv_filters_spec.cr178
1 files changed, 178 insertions, 0 deletions
diff --git a/spec/invidious/search/iv_filters_spec.cr b/spec/invidious/search/iv_filters_spec.cr
new file mode 100644
index 00000000..6e8e6f3d
--- /dev/null
+++ b/spec/invidious/search/iv_filters_spec.cr
@@ -0,0 +1,178 @@
+require "../../../src/invidious/search/filters"
+
+require "http/params"
+require "spectator"
+
+Spectator.configure do |config|
+ config.fail_blank
+ config.randomize
+end
+
+FEATURES_TEXT = {
+ Invidious::Search::Filters::Features::Live => "live",
+ Invidious::Search::Filters::Features::FourK => "4k",
+ Invidious::Search::Filters::Features::HD => "hd",
+ Invidious::Search::Filters::Features::Subtitles => "subtitles",
+ Invidious::Search::Filters::Features::CCommons => "commons",
+ Invidious::Search::Filters::Features::ThreeSixty => "360",
+ Invidious::Search::Filters::Features::VR180 => "vr180",
+ Invidious::Search::Filters::Features::ThreeD => "3d",
+ Invidious::Search::Filters::Features::HDR => "hdr",
+ Invidious::Search::Filters::Features::Location => "location",
+ Invidious::Search::Filters::Features::Purchased => "purchased",
+}
+
+Spectator.describe Invidious::Search::Filters do
+ # -------------------
+ # Decode (legacy)
+ # -------------------
+
+ describe "#from_legacy_filters" do
+ it "Decodes channel: filter" do
+ query = "test channel:UC123456 request"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new)
+ expect(chan).to eq("UC123456")
+ expect(qury).to eq("test request")
+ expect(subs).to be_false
+ end
+
+ it "Decodes user: filter" do
+ query = "user:LinusTechTips broke something (again)"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new)
+ expect(chan).to eq("LinusTechTips")
+ expect(qury).to eq("broke something (again)")
+ expect(subs).to be_false
+ end
+
+ it "Decodes type: filter" do
+ Invidious::Search::Filters::Type.each do |value|
+ query = "Eiffel 65 - Blue [1 Hour] type:#{value}"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new(type: value))
+ expect(chan).to eq("")
+ expect(qury).to eq("Eiffel 65 - Blue [1 Hour]")
+ expect(subs).to be_false
+ end
+ end
+
+ it "Decodes content_type: filter" do
+ Invidious::Search::Filters::Type.each do |value|
+ query = "I like to watch content_type:#{value}"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new(type: value))
+ expect(chan).to eq("")
+ expect(qury).to eq("I like to watch")
+ expect(subs).to be_false
+ end
+ end
+
+ it "Decodes date: filter" do
+ Invidious::Search::Filters::Date.each do |value|
+ query = "This date:#{value} is old!"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new(date: value))
+ expect(chan).to eq("")
+ expect(qury).to eq("This is old!")
+ expect(subs).to be_false
+ end
+ end
+
+ it "Decodes duration: filter" do
+ Invidious::Search::Filters::Duration.each do |value|
+ query = "This duration:#{value} is old!"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new(duration: value))
+ expect(chan).to eq("")
+ expect(qury).to eq("This is old!")
+ expect(subs).to be_false
+ end
+ end
+
+ it "Decodes feature: filter" do
+ Invidious::Search::Filters::Features.each do |value|
+ string = FEATURES_TEXT[value]
+ query = "I like my precious feature:#{string} ^^"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new(features: value))
+ expect(chan).to eq("")
+ expect(qury).to eq("I like my precious ^^")
+ expect(subs).to be_false
+ end
+ end
+
+ it "Decodes features: filter" do
+ query = "This search has many features:vr180,cc,hdr :o"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ features = Invidious::Search::Filters::Features.flags(HDR, VR180, CCommons)
+
+ expect(fltr).to eq(described_class.new(features: features))
+ expect(chan).to eq("")
+ expect(qury).to eq("This search has many :o")
+ expect(subs).to be_false
+ end
+
+ it "Decodes sort: filter" do
+ Invidious::Search::Filters::Sort.each do |value|
+ query = "Computer? sort:#{value} my files!"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new(sort: value))
+ expect(chan).to eq("")
+ expect(qury).to eq("Computer? my files!")
+ expect(subs).to be_false
+ end
+ end
+
+ it "Decodes subscriptions: filter" do
+ query = "enable subscriptions:true"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new)
+ expect(chan).to eq("")
+ expect(qury).to eq("enable")
+ expect(subs).to be_true
+ end
+
+ it "Ignores junk data" do
+ query = "duration:I sort:like type:cleaning features:stuff date:up!"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new)
+ expect(chan).to eq("")
+ expect(qury).to eq("")
+ expect(subs).to be_false
+ end
+
+ it "Keeps unknown keys" do
+ query = "to:be or:not to:be"
+
+ fltr, chan, qury, subs = described_class.from_legacy_filters(query)
+
+ expect(fltr).to eq(described_class.new)
+ expect(chan).to eq("")
+ expect(qury).to eq("to:be or:not to:be")
+ expect(subs).to be_false
+ end
+ end
+end