def test_limit_matches_input(self, lim): """Given an integer in the allowed range, it should be passed through.""" builder = query.Builder() q = builder.build({"limit": str(lim)}) assert q["size"] == lim
def test_sort_includes_ignore_unmapped(self): """'ignore_unmapped': True is used in the sort clause.""" builder = query.Builder() q = builder.build({}) assert q["sort"][0]["updated"]["ignore_unmapped"] == True
def test_defaults_to_match_all(self): """If no query params are given a "match_all": {} query is returned.""" builder = query.Builder() q = builder.build({}) assert q["query"] == {"match_all": {}}
def test_default_param_action(self): """Other params are added as "match" clauses.""" builder = query.Builder() q = builder.build({"foo": "bar"}) assert q["query"] == {"bool": {"must": [{"match": {"foo": "bar"}}]}}
def test_with_custom_sort(self): """Custom sorts are returned in the query dict.""" builder = query.Builder() q = builder.build({"sort": "title"}) assert q["sort"] == [{'title': {'ignore_unmapped': True, 'order': 'desc'}}]
def test_passes_params_to_aggregations(self): testaggregation = mock.Mock() builder = query.Builder() builder.append_aggregation(testaggregation) builder.build({"foo": "bar"}) testaggregation.assert_called_with({"foo": "bar"})
def test_limit_output_within_bounds(self, text): """Given any string input, output should be in the allowed range.""" builder = query.Builder() q = builder.build({"limit": text}) assert isinstance(q["size"], int) assert 0 <= q["size"] <= LIMIT_MAX
def test_limit_output_within_bounds_int_input(self, lim): """Given any integer input, output should be in the allowed range.""" builder = query.Builder() q = builder.build({"limit": str(lim)}) assert isinstance(q["size"], int) assert 0 <= q["size"] <= LIMIT_MAX
def test_with_custom_order(self): """'order' params are returned in the query dict if given.""" builder = query.Builder() q = builder.build({"order": "asc"}) sort = q["sort"] assert sort[0]["updated"]["order"] == "asc"
def test_order_defaults_to_desc(self): """'order': "desc" is returned in the q dict by default.""" builder = query.Builder() q = builder.build({}) sort = q["sort"] assert sort[0]["updated"]["order"] == "desc"
def test_passes_params_to_matchers(self): testmatcher = mock.Mock() builder = query.Builder() builder.append_matcher(testmatcher) builder.build({"foo": "bar"}) testmatcher.assert_called_with({"foo": "bar"})
def test_ignores_filters_returning_none(self): testfilter = mock.Mock() testfilter.return_value = None builder = query.Builder() builder.append_filter(testfilter) q = builder.build({}) assert q["query"] == {"match_all": {}}
def test_offset(self, offset, from_): builder = query.Builder() if offset is MISSING: q = builder.build({}) else: q = builder.build({"offset": offset}) assert q["from"] == from_
def test_with_evil_arguments(self): builder = query.Builder() params = {"offset": "3foo", "limit": '\' drop table annotations'} q = builder.build(params) assert q["from"] == 0 assert q["size"] == 20 assert q["query"] == {'match_all': {}}
def test_sort_is_by_updated(self): """Sort defaults to "updated".""" builder = query.Builder() q = builder.build({}) sort = q["sort"] assert len(sort) == 1 assert sort[0].keys() == ["updated"]
def test_adds_aggregations_to_query(self): testaggregation = mock.Mock(key="foobar") # testaggregation.key.return_value = "foobar" testaggregation.return_value = {"terms": {"field": "foo"}} builder = query.Builder() builder.append_aggregation(testaggregation) q = builder.build({}) assert q["aggs"] == {"foobar": {"terms": {"field": "foo"}}}
def test_adds_matchers_to_query(self): testmatcher = mock.Mock() testmatcher.return_value = {"match": {"giraffe": "nose"}} builder = query.Builder() builder.append_matcher(testmatcher) q = builder.build({}) assert q["query"] == { "bool": {"must": [{"match": {"giraffe": "nose"}}]}, }
def default_querybuilder(request): builder = query.Builder() builder.append_filter(query.AuthFilter(request)) builder.append_filter(query.UriFilter(request)) builder.append_filter(query.GroupFilter()) builder.append_filter(query.UserFilter()) builder.append_matcher(query.AnyMatcher()) builder.append_matcher(query.TagsMatcher()) for factory in request.registry.get(FILTERS_KEY, []): builder.append_filter(factory(request)) for factory in request.registry.get(MATCHERS_KEY, []): builder.append_matcher(factory(request)) return builder
def test_filters_query_by_filter_results(self): testfilter = mock.Mock() testfilter.return_value = {"term": {"giraffe": "nose"}} builder = query.Builder() builder.append_filter(testfilter) q = builder.build({}) assert q["query"] == { "filtered": { "filter": {"and": [{"term": {"giraffe": "nose"}}]}, "query": {"match_all": {}}, }, }
def test_default_params_multidict(self): """Multiple params go into multiple "match" dicts.""" builder = query.Builder() params = multidict.MultiDict() params.add("user", "fred") params.add("user", "bob") q = builder.build(params) assert q["query"] == { "bool": { "must": [ {"match": {"user": "******"}}, {"match": {"user": "******"}} ] } }
def test_limit_missing(self): builder = query.Builder() q = builder.build({}) assert q["size"] == LIMIT_DEFAULT