mirror of
https://github.com/beetbox/beets.git
synced 2026-07-18 12:57:11 -04:00
177 lines
5.4 KiB
Python
177 lines
5.4 KiB
Python
"""Tests for dbcore query parsing helpers."""
|
|
|
|
import unittest
|
|
|
|
from beets import dbcore
|
|
from beets.dbcore import query, sort
|
|
from beets.test.fixtures import ModelFixture1, SortFixture
|
|
|
|
|
|
class QueryParseTest(unittest.TestCase):
|
|
def pqp(self, part):
|
|
return dbcore.queryparse.parse_query_part(
|
|
part, {"year": query.NumericQuery}, {":": query.RegexpQuery}
|
|
)[:-1] # remove the negate flag
|
|
|
|
def test_one_basic_term(self):
|
|
q = "test"
|
|
r = (None, "test", query.SubstringQuery)
|
|
assert self.pqp(q) == r
|
|
|
|
def test_one_keyed_term(self):
|
|
q = "test:val"
|
|
r = ("test", "val", query.SubstringQuery)
|
|
assert self.pqp(q) == r
|
|
|
|
def test_colon_at_end(self):
|
|
q = "test:"
|
|
r = ("test", "", query.SubstringQuery)
|
|
assert self.pqp(q) == r
|
|
|
|
def test_one_basic_regexp(self):
|
|
q = r":regexp"
|
|
r = (None, "regexp", query.RegexpQuery)
|
|
assert self.pqp(q) == r
|
|
|
|
def test_keyed_regexp(self):
|
|
q = r"test::regexp"
|
|
r = ("test", "regexp", query.RegexpQuery)
|
|
assert self.pqp(q) == r
|
|
|
|
def test_escaped_colon(self):
|
|
q = r"test\:val"
|
|
r = (None, "test:val", query.SubstringQuery)
|
|
assert self.pqp(q) == r
|
|
|
|
def test_escaped_colon_in_regexp(self):
|
|
q = r":test\:regexp"
|
|
r = (None, "test:regexp", query.RegexpQuery)
|
|
assert self.pqp(q) == r
|
|
|
|
def test_single_year(self):
|
|
q = "year:1999"
|
|
r = ("year", "1999", query.NumericQuery)
|
|
assert self.pqp(q) == r
|
|
|
|
def test_multiple_years(self):
|
|
q = "year:1999..2010"
|
|
r = ("year", "1999..2010", query.NumericQuery)
|
|
assert self.pqp(q) == r
|
|
|
|
def test_empty_query_part(self):
|
|
q = ""
|
|
r = (None, "", query.SubstringQuery)
|
|
assert self.pqp(q) == r
|
|
|
|
|
|
class QueryFromStringsTest(unittest.TestCase):
|
|
def qfs(self, strings):
|
|
return dbcore.queryparse.query_from_strings(
|
|
query.AndQuery, ModelFixture1, {":": query.RegexpQuery}, strings
|
|
)
|
|
|
|
def test_zero_parts(self):
|
|
q = self.qfs([])
|
|
assert isinstance(q, query.AndQuery)
|
|
assert len(q.subqueries) == 1
|
|
assert isinstance(q.subqueries[0], query.TrueQuery)
|
|
|
|
def test_two_parts(self):
|
|
q = self.qfs(["foo", "bar:baz"])
|
|
assert isinstance(q, query.AndQuery)
|
|
assert len(q.subqueries) == 2
|
|
assert isinstance(q.subqueries[0], query.OrQuery)
|
|
assert isinstance(q.subqueries[1], query.SubstringQuery)
|
|
|
|
def test_parse_fixed_type_query(self):
|
|
q = self.qfs(["field_one:2..3"])
|
|
assert isinstance(q.subqueries[0], query.NumericQuery)
|
|
|
|
def test_parse_flex_type_query(self):
|
|
q = self.qfs(["some_float_field:2..3"])
|
|
assert isinstance(q.subqueries[0], query.NumericQuery)
|
|
|
|
def test_empty_query_part(self):
|
|
q = self.qfs([""])
|
|
assert isinstance(q.subqueries[0], query.TrueQuery)
|
|
|
|
|
|
class SortFromStringsTest(unittest.TestCase):
|
|
def sfs(self, strings):
|
|
return dbcore.queryparse.sort_from_strings(ModelFixture1, strings)
|
|
|
|
def test_zero_parts(self):
|
|
s = self.sfs([])
|
|
assert isinstance(s, sort.NullSort)
|
|
assert s == sort.NullSort()
|
|
|
|
def test_one_parts(self):
|
|
s = self.sfs(["field+"])
|
|
assert isinstance(s, sort.Sort)
|
|
|
|
def test_two_parts(self):
|
|
s = self.sfs(["field+", "another_field-"])
|
|
assert isinstance(s, sort.MultipleSort)
|
|
assert len(s.sorts) == 2
|
|
|
|
def test_fixed_field_sort(self):
|
|
s = self.sfs(["field_one+"])
|
|
assert isinstance(s, sort.FixedFieldSort)
|
|
assert s == sort.FixedFieldSort("field_one")
|
|
|
|
def test_flex_field_sort(self):
|
|
s = self.sfs(["flex_field+"])
|
|
assert isinstance(s, sort.SlowFieldSort)
|
|
assert s == sort.SlowFieldSort("flex_field")
|
|
|
|
def test_special_sort(self):
|
|
s = self.sfs(["some_sort+"])
|
|
assert isinstance(s, SortFixture)
|
|
|
|
|
|
class ParseSortedQueryTest(unittest.TestCase):
|
|
def psq(self, parts):
|
|
return dbcore.parse_sorted_query(ModelFixture1, parts.split())
|
|
|
|
def test_and_query(self):
|
|
q, s = self.psq("foo bar")
|
|
assert isinstance(q, query.AndQuery)
|
|
assert isinstance(s, sort.NullSort)
|
|
assert len(q.subqueries) == 2
|
|
|
|
def test_or_query(self):
|
|
q, s = self.psq("foo , bar")
|
|
assert isinstance(q, query.OrQuery)
|
|
assert isinstance(s, sort.NullSort)
|
|
assert len(q.subqueries) == 2
|
|
|
|
def test_no_space_before_comma_or_query(self):
|
|
q, s = self.psq("foo, bar")
|
|
assert isinstance(q, query.OrQuery)
|
|
assert isinstance(s, sort.NullSort)
|
|
assert len(q.subqueries) == 2
|
|
|
|
def test_no_spaces_or_query(self):
|
|
q, s = self.psq("foo,bar")
|
|
assert isinstance(q, query.AndQuery)
|
|
assert isinstance(s, sort.NullSort)
|
|
assert len(q.subqueries) == 1
|
|
|
|
def test_trailing_comma_or_query(self):
|
|
q, s = self.psq("foo , bar ,")
|
|
assert isinstance(q, query.OrQuery)
|
|
assert isinstance(s, sort.NullSort)
|
|
assert len(q.subqueries) == 3
|
|
|
|
def test_leading_comma_or_query(self):
|
|
q, s = self.psq(", foo , bar")
|
|
assert isinstance(q, query.OrQuery)
|
|
assert isinstance(s, sort.NullSort)
|
|
assert len(q.subqueries) == 3
|
|
|
|
def test_only_direction(self):
|
|
q, s = self.psq("-")
|
|
assert isinstance(q, query.AndQuery)
|
|
assert isinstance(s, sort.NullSort)
|
|
assert len(q.subqueries) == 1
|