diff --git a/awx/api/serializers.py b/awx/api/serializers.py index f4a61f0c43..858aeb4ebf 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -1600,7 +1600,7 @@ class InventorySerializer(BaseSerializerWithVariables): }) SmartFilter().query_from_string(host_filter) except RuntimeError as e: - raise models.base.ValidationError(e) + raise models.base.ValidationError(str(e)) return host_filter def validate(self, attrs): diff --git a/awx_collection/test/awx/test_inventory.py b/awx_collection/test/awx/test_inventory.py new file mode 100644 index 0000000000..2ba52ac0a2 --- /dev/null +++ b/awx_collection/test/awx/test_inventory.py @@ -0,0 +1,60 @@ +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import pytest + +from awx.main.models import Inventory + + +@pytest.mark.django_db +def test_inventory_create(run_module, admin_user, organization): + result = run_module('tower_inventory', { + 'name': 'foo-inventory', + 'organization': organization.name, + 'variables': {'foo': 'bar', 'another-foo': {'barz': 'bar2'}}, + 'state': 'present' + }, admin_user) + + inv = Inventory.objects.get(name='foo-inventory') + assert inv.variables == '{"foo": "bar", "another-foo": {"barz": "bar2"}}' + + result.pop('module_args', None) + result.pop('invocation', None) + assert result == { + "name": "foo-inventory", + "id": inv.id, + "changed": True + } + + assert inv.organization_id == organization.id + + +@pytest.mark.django_db +def test_invalid_smart_inventory_create(run_module, admin_user, organization): + result = run_module('tower_inventory', { + 'name': 'foo-inventory', + 'organization': organization.name, + 'kind': 'smart', + 'host_filter': 'ansible', + 'state': 'present' + }, admin_user) + assert result.get('failed', False), result + + assert 'Invalid query ansible' in result['msg'] + + +@pytest.mark.django_db +def test_valid_smart_inventory_create(run_module, admin_user, organization): + result = run_module('tower_inventory', { + 'name': 'foo-inventory', + 'organization': organization.name, + 'kind': 'smart', + 'host_filter': 'name=my_host', + 'state': 'present' + }, admin_user) + assert not result.get('failed', False), result + + inv = Inventory.objects.get(name='foo-inventory') + assert inv.host_filter == 'name=my_host' + assert inv.kind == 'smart' + assert inv.organization_id == organization.id