add tests for host_filter

* Ensure that building the smart inventory query string doesn't invoke
the database.
This commit is contained in:
chris meyers
2019-02-12 09:07:08 -05:00
parent ed78978b5f
commit c121565209

View File

@@ -5,6 +5,7 @@ from unittest import mock
# AWX
from awx.main.utils.filters import SmartFilter, ExternalLoggerEnabled
from awx.main.models import Host
# Django
from django.db.models import Q
@@ -199,7 +200,6 @@ class TestSmartFilterQueryFromString():
@pytest.mark.parametrize("filter_string,q_expected", [
('search=foo', Q(Q(**{u"name__icontains": u"foo"}) | Q(**{ u"description__icontains": u"foo"}))),
('group__search=foo', Q(Q(**{u"group__name__icontains": u"foo"}) | Q(**{u"group__description__icontains": u"foo"}))),
('search=foo and group__search=foo', Q(
Q(**{u"name__icontains": u"foo"}) | Q(**{ u"description__icontains": u"foo"}),
@@ -207,15 +207,35 @@ class TestSmartFilterQueryFromString():
('search=foo or ansible_facts__a=null',
Q(Q(**{u"name__icontains": u"foo"}) | Q(**{u"description__icontains": u"foo"})) |
Q(**{u"ansible_facts__contains": {u"a": None}})),
('search=foo or ansible_facts__a="null"',
Q(Q(**{u"name__icontains": u"foo"}) | Q(**{u"description__icontains": u"foo"})) |
Q(**{u"ansible_facts__contains": {u"a": u"\"null\""}})),
])
def test_search_related_fields(self, mock_get_host_model, filter_string, q_expected):
q = SmartFilter.query_from_string(filter_string)
assert str(q) == str(q_expected)
class TestSmartFilterQueryFromStringNoDB():
@pytest.mark.parametrize("filter_string,q_expected", [
('ansible_facts__a="true" and ansible_facts__b="true" and ansible_facts__c="true"',
(Q(**{u"ansible_facts__contains": {u"a": u"true"}}) &
Q(**{u"ansible_facts__contains": {u"b": u"true"}}) &
Q(**{u"ansible_facts__contains": {u"c": u"true"}}))),
('ansible_facts__a="true" or ansible_facts__b="true" or ansible_facts__c="true"',
(Q(**{u"ansible_facts__contains": {u"a": u"true"}}) |
Q(**{u"ansible_facts__contains": {u"b": u"true"}}) |
Q(**{u"ansible_facts__contains": {u"c": u"true"}}))),
('search=foo',
Q(Q(**{ u"description__icontains": u"foo"}) | Q(**{u"name__icontains": u"foo"}))),
('search=foo and ansible_facts__a="null"',
Q(Q(**{u"description__icontains": u"foo"}) | Q(**{u"name__icontains": u"foo"})) &
Q(**{u"ansible_facts__contains": {u"a": u"\"null\""}})),
('name=foo or name=bar and name=foobar',
Q(name="foo") | Q(name="bar") & Q(name="foobar"))
])
def test_does_not_invoke_db(self, filter_string, q_expected):
q = SmartFilter.query_from_string(filter_string)
assert str(q.query) == str(Host.objects.filter(q_expected).query)
'''
#('"facts__quoted_val"="f\"oo"', 1),
#('facts__facts__arr[]="foo"', 1),