1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
import pytest
from lunr.query import Query, QueryPresence
from lunr.token import Token
from lunr.tokenizer import Tokenizer
class BaseQuerySuite:
ALL_FIELDS = ["title", "body"]
def setup_method(self, method):
self.query = Query(self.ALL_FIELDS)
class TestQueryTerm(BaseQuerySuite):
def test_single_string_term_adds_single_clause(self):
self.query.clause(term="foo")
assert len(self.query.clauses) == 1
assert self.query.clauses[0].term == "foo"
assert repr(self.query) == '<Query fields="title,body" clauses="foo">'
assert repr(self.query.clauses[0]) == '<Clause term="foo">'
def test_single_token_term_adds_single_clause(self):
self.query.term(Token("foo"))
assert len(self.query.clauses) == 1
assert self.query.clauses[0].term == "foo"
def test_multiple_string_terms_adds_multiple_clauses(self):
self.query.term(["foo", "bar"])
assert len(self.query.clauses) == 2
assert self.query.clauses[0].term == "foo"
assert self.query.clauses[1].term == "bar"
assert repr(self.query) == ('<Query fields="title,body" clauses="foo,bar">')
def test_multiple_token_terms_adds_multiple_clauses(self):
self.query.term(Tokenizer("foo bar"))
assert len(self.query.clauses) == 2
assert self.query.clauses[0].term == "foo"
assert self.query.clauses[1].term == "bar"
def test_multiple_string_terms_with_options(self):
self.query.term(["foo", "bar"], use_pipeline=False)
assert len(self.query.clauses) == 2
assert self.query.clauses[0].term == "foo"
assert self.query.clauses[1].term == "bar"
class TestQueryClause(BaseQuerySuite):
def test_clause_defaults(self):
self.query.clause(term="foo")
self.clause = self.query.clauses[0]
assert self.clause.fields == self.ALL_FIELDS
assert self.clause.boost == 1
assert self.clause.use_pipeline is True
def test_clause_specified(self):
self.query.clause(term="foo", boost=10, fields=["title"], use_pipeline=False)
self.clause = self.query.clauses[0]
assert self.clause.fields == ["title"]
assert self.clause.boost == 10
assert self.clause.use_pipeline is False
@pytest.mark.parametrize(
"wildcard, expected_term",
[
(Query.WILDCARD_NONE, "foo"),
(Query.WILDCARD_LEADING, "*foo"),
(Query.WILDCARD_TRAILING, "foo*"),
(Query.WILDCARD_LEADING | Query.WILDCARD_TRAILING, "*foo*"),
],
)
def test_clause_wildcard(self, wildcard, expected_term):
self.query.clause(term="foo", wildcard=wildcard)
self.clause = self.query.clauses[0]
assert self.clause.term == expected_term
def test_clause_wildcard_existing(self):
self.query.clause(
term="*foo*", wildcard=Query.WILDCARD_LEADING | Query.WILDCARD_TRAILING
)
self.clause = self.query.clauses[0]
assert self.clause.term == "*foo*"
class TestQueryIsNegated(BaseQuerySuite):
def test_all_prohibited(self):
self.query.term("foo", presence=QueryPresence.PROHIBITED)
self.query.term("bar", presence=QueryPresence.PROHIBITED)
assert self.query.is_negated() is True
def test_some_prohibited(self):
self.query.term("foo", presence=QueryPresence.PROHIBITED)
self.query.term("bar", presence=QueryPresence.REQUIRED)
assert self.query.is_negated() is False
def test_nome_prohibited(self):
self.query.term("foo", presence=QueryPresence.OPTIONAL)
self.query.term("bar", presence=QueryPresence.REQUIRED)
assert self.query.is_negated() is False
|