moved logic to the validate function and fixed tests accordingly

This commit is contained in:
Jake Jackson
2020-05-22 09:26:38 -04:00
parent 606d4e0ea2
commit 30757f8289
2 changed files with 41 additions and 14 deletions

View File

@@ -1719,8 +1719,6 @@ class HostSerializer(BaseSerializerWithVariables):
name = force_text(value or '') name = force_text(value or '')
# Validate here only, update in main validate method. # Validate here only, update in main validate method.
host, port = self._get_host_port_from_name(name) host, port = self._get_host_port_from_name(name)
if Group.objects.filter(name=value).exists():
raise serializers.ValidationError(_('Invalid group name. Name already exists as a Group.'))
return value return value
def validate_inventory(self, value): def validate_inventory(self, value):
@@ -1733,6 +1731,7 @@ class HostSerializer(BaseSerializerWithVariables):
def validate(self, attrs): def validate(self, attrs):
name = force_text(attrs.get('name', self.instance and self.instance.name or '')) name = force_text(attrs.get('name', self.instance and self.instance.name or ''))
inventory = attrs.get('inventory', self.instance and self.instance.inventory or '')
host, port = self._get_host_port_from_name(name) host, port = self._get_host_port_from_name(name)
if port: if port:
@@ -1741,6 +1740,8 @@ class HostSerializer(BaseSerializerWithVariables):
vars_dict = parse_yaml_or_json(variables) vars_dict = parse_yaml_or_json(variables)
vars_dict['ansible_ssh_port'] = port vars_dict['ansible_ssh_port'] = port
attrs['variables'] = json.dumps(vars_dict) attrs['variables'] = json.dumps(vars_dict)
if Group.objects.filter(name=name, inventory=inventory).exists():
raise serializers.ValidationError(_('A Group with that name already exists.'))
return super(HostSerializer, self).validate(attrs) return super(HostSerializer, self).validate(attrs)
@@ -1807,11 +1808,16 @@ class GroupSerializer(BaseSerializerWithVariables):
res['inventory'] = self.reverse('api:inventory_detail', kwargs={'pk': obj.inventory.pk}) res['inventory'] = self.reverse('api:inventory_detail', kwargs={'pk': obj.inventory.pk})
return res return res
def validate(self, attrs):
name = force_text(attrs.get('name', self.instance and self.instance.name or ''))
inventory = attrs.get('inventory', self.instance and self.instance.inventory or '')
if Host.objects.filter(name=name, inventory=inventory).exists():
raise serializers.ValidationError(_('A Host with that name already exists.'))
return super(GroupSerializer, self).validate(attrs)
def validate_name(self, value): def validate_name(self, value):
if value in ('all', '_meta'): if value in ('all', '_meta'):
raise serializers.ValidationError(_('Invalid group name.')) raise serializers.ValidationError(_('Invalid group name.'))
elif Host.objects.filter(name=value).exists():
raise serializers.ValidationError(_('Invalid group name. Name already exists as a Host.'))
return value return value
def validate_inventory(self, value): def validate_inventory(self, value):

View File

@@ -59,21 +59,42 @@ def test_inventory_source_unique_together_with_inv(inventory_factory):
is2 = InventorySource(name='foo', source='file', inventory=inv2) is2 = InventorySource(name='foo', source='file', inventory=inv2)
is2.validate_unique() is2.validate_unique()
@pytest.mark.django_db @pytest.mark.django_db
def test_inventory_host_name_unique(scm_inventory, post, admin_user): def test_inventory_host_name_unique(scm_inventory, post, admin_user):
inv_src = scm_inventory.inventory_sources.first() inv_src = scm_inventory.inventory_sources.first()
group = inv_src.groups.create(name='barfoo', inventory=scm_inventory) inv_src.groups.create(name='barfoo', inventory=scm_inventory)
group.save() resp = post(
host1 = inv_src.hosts.create(name='barfoo', inventory=scm_inventory) reverse('api:inventory_hosts_list', kwargs={'pk': scm_inventory.id}),
post(reverse('api:inventory_hosts_list', kwargs={'pk': host1.id}), admin_user, expect=400) {
'name': 'barfoo',
'inventory_id': scm_inventory.id,
},
admin_user,
expect=400
)
assert resp.status_code == 400
assert "A Group with that name already exists." in json.dumps(resp.data)
@pytest.mark.django_db @pytest.mark.django_db
def test_inventory_group_name_unique(scm_inventory, post, admin_user): def test_inventory_group_name_unique(scm_inventory, post, admin_user):
inv_src = scm_inventory.inventory_sources.first() inv_src = scm_inventory.inventory_sources.first()
host = inv_src.hosts.create(name='barfoo', inventory=scm_inventory) inv_src.hosts.create(name='barfoo', inventory=scm_inventory)
host.save() resp = post(
group = inv_src.groups.create(name='barfoo', inventory=scm_inventory) reverse('api:inventory_groups_list', kwargs={'pk': scm_inventory.id}),
post(reverse('api:inventory_groups_list', kwargs={'pk': group.id}), admin_user, expect=400) {
'name': 'barfoo',
'inventory_id': scm_inventory.id,
},
admin_user,
expect=400
)
assert resp.status_code == 400
assert "A Host with that name already exists." in json.dumps(resp.data)
@pytest.mark.parametrize("role_field,expected_status_code", [ @pytest.mark.parametrize("role_field,expected_status_code", [
(None, 403), (None, 403),