From 102b8a4f91beb329de8367fc7113dda0bb9911c2 Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Tue, 10 May 2016 10:37:20 -0400 Subject: [PATCH 1/2] refector old update_password tests --- .../functional/commands/test_commands.py | 52 +++++++++++++++++++ .../tests/old/commands/update_password.py | 37 ------------- 2 files changed, 52 insertions(+), 37 deletions(-) create mode 100644 awx/main/tests/functional/commands/test_commands.py delete mode 100644 awx/main/tests/old/commands/update_password.py diff --git a/awx/main/tests/functional/commands/test_commands.py b/awx/main/tests/functional/commands/test_commands.py new file mode 100644 index 0000000000..5d661ca80e --- /dev/null +++ b/awx/main/tests/functional/commands/test_commands.py @@ -0,0 +1,52 @@ +import sys +import pytest + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +from django.core.management import call_command + +from awx.main.management.commands.update_password import UpdatePassword + +def run_command(name, *args, **options): + command_runner = options.pop('command_runner', call_command) + stdin_fileobj = options.pop('stdin_fileobj', None) + options.setdefault('verbosity', 1) + options.setdefault('interactive', False) + original_stdin = sys.stdin + original_stdout = sys.stdout + original_stderr = sys.stderr + if stdin_fileobj: + sys.stdin = stdin_fileobj + sys.stdout = StringIO() + sys.stderr = StringIO() + result = None + try: + result = command_runner(name, *args, **options) + except Exception as e: + result = e + finally: + captured_stdout = sys.stdout.getvalue() + captured_stderr = sys.stderr.getvalue() + sys.stdin = original_stdin + sys.stdout = original_stdout + sys.stderr = original_stderr + return result, captured_stdout, captured_stderr + +@pytest.mark.parametrize( + "command,username,password,expected,changed", [ + ('update_password', 'admin', 'dingleberry', 'Password updated\n', True), + ('update_password', 'admin', 'admin', 'Password not updated\n', False), + ('update_password', None, 'foo', 'username required', False), + ('update_password', 'admin', None, 'password required', False), + ] +) +def test_run_command(mocker, command, username, password, expected, changed): + with mocker.patch.object(UpdatePassword, 'update_password', return_value=changed): + result, stdout, stderr = run_command(command, username=username, password=password) + if result is None: + assert stdout == expected + else: + assert str(result) == expected diff --git a/awx/main/tests/old/commands/update_password.py b/awx/main/tests/old/commands/update_password.py deleted file mode 100644 index cecbb1667d..0000000000 --- a/awx/main/tests/old/commands/update_password.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) 2015 Ansible, Inc. -# All Rights Reserved - -# AWX -from awx.main.tests.base import BaseTest -from command_base import BaseCommandMixin - -# Django -from django.core.management.base import CommandError - -__all__ = ['UpdatePasswordCommandFunctionalTest'] - -class UpdatePasswordCommandFunctionalTest(BaseCommandMixin, BaseTest): - def setUp(self): - super(UpdatePasswordCommandFunctionalTest, self).setUp() - self.create_test_license_file() - self.setup_instances() - self.setup_users() - - def test_updated_ok(self): - result, stdout, stderr = self.run_command('update_password', username='admin', password='dingleberry') - self.assertEqual(stdout, 'Password updated\n') - - def test_same_password(self): - result, stdout, stderr = self.run_command('update_password', username='admin', password='admin') - self.assertEqual(stdout, 'Password not updated\n') - - def test_error_username_required(self): - result, stdout, stderr = self.run_command('update_password', password='foo') - self.assertIsInstance(result, CommandError) - self.assertEqual(str(result), 'username required') - - def test_error_password_required(self): - result, stdout, stderr = self.run_command('update_password', username='admin') - self.assertIsInstance(result, CommandError) - self.assertEqual(str(result), 'password required') - From 2c0c8591df775090ad54c8d7da42be20d3985b49 Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Tue, 10 May 2016 11:42:54 -0400 Subject: [PATCH 2/2] refactor old remove_instance tests --- .../functional/commands/test_commands.py | 37 ++++++++++++++---- .../tests/old/commands/remove_instance.py | 39 ------------------- 2 files changed, 30 insertions(+), 46 deletions(-) delete mode 100644 awx/main/tests/old/commands/remove_instance.py diff --git a/awx/main/tests/functional/commands/test_commands.py b/awx/main/tests/functional/commands/test_commands.py index 5d661ca80e..631de3ee04 100644 --- a/awx/main/tests/functional/commands/test_commands.py +++ b/awx/main/tests/functional/commands/test_commands.py @@ -8,7 +8,10 @@ except ImportError: from django.core.management import call_command +from awx.main.models import Instance + from awx.main.management.commands.update_password import UpdatePassword +from awx.main.management.commands.remove_instance import Command as RemoveInstance def run_command(name, *args, **options): command_runner = options.pop('command_runner', call_command) @@ -35,18 +38,38 @@ def run_command(name, *args, **options): sys.stderr = original_stderr return result, captured_stdout, captured_stderr + @pytest.mark.parametrize( - "command,username,password,expected,changed", [ - ('update_password', 'admin', 'dingleberry', 'Password updated\n', True), - ('update_password', 'admin', 'admin', 'Password not updated\n', False), - ('update_password', None, 'foo', 'username required', False), - ('update_password', 'admin', None, 'password required', False), + "username,password,expected,changed", [ + ('admin', 'dingleberry', 'Password updated\n', True), + ('admin', 'admin', 'Password not updated\n', False), + (None, 'foo', 'username required', False), + ('admin', None, 'password required', False), ] ) -def test_run_command(mocker, command, username, password, expected, changed): +def test_update_password_command(mocker, username, password, expected, changed): with mocker.patch.object(UpdatePassword, 'update_password', return_value=changed): - result, stdout, stderr = run_command(command, username=username, password=password) + result, stdout, stderr = run_command('update_password', username=username, password=password) if result is None: assert stdout == expected else: assert str(result) == expected + + +@pytest.mark.parametrize( + "primary,hostname,startswith,exception", [ + (True, "127.0.0.1", "Cannot remove primary", None), + (False, "127.0.0.2", "Successfully removed", None), + (False, "127.0.0.3", "No matching instance", Instance.DoesNotExist), + ] +) +def test_remove_instance_command(mocker, primary, hostname, startswith, exception): + mock_instance = mocker.MagicMock(primary=primary, enforce_unique_find=True) + with mocker.patch.object(Instance.objects, 'get', return_value=mock_instance, side_effect=exception): + with mocker.patch.object(RemoveInstance, 'include_option_hostname_uuid_find'): + with mocker.patch.object(RemoveInstance, 'get_unique_fields', return_value={'hostname':hostname, 'uuid':1}): + result, stdout, stderr = run_command("remove_instance", hostname=hostname) + if result is None: + assert stdout.startswith(startswith) + else: + assert str(result).startswith(startswith) diff --git a/awx/main/tests/old/commands/remove_instance.py b/awx/main/tests/old/commands/remove_instance.py deleted file mode 100644 index 6fa8d65d4b..0000000000 --- a/awx/main/tests/old/commands/remove_instance.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2015 Ansible, Inc. -# All Rights Reserved - -# Python -import uuid - -# AWX -from awx.main.tests.base import BaseTest -from command_base import BaseCommandMixin -from awx.main.models import * # noqa - -__all__ = ['RemoveInstanceCommandFunctionalTest'] - -class RemoveInstanceCommandFunctionalTest(BaseCommandMixin, BaseTest): - uuids = [] - instances = [] - - def setup_instances(self): - self.uuids = [uuid.uuid4().hex for x in range(0, 3)] - self.instances.append(Instance(uuid=settings.SYSTEM_UUID, primary=True, hostname='127.0.0.1')) - self.instances.append(Instance(uuid=self.uuids[0], primary=False, hostname='127.0.0.2')) - self.instances.append(Instance(uuid=self.uuids[1], primary=False, hostname='127.0.0.3')) - self.instances.append(Instance(uuid=self.uuids[2], primary=False, hostname='127.0.0.4')) - for x in self.instances: - x.save() - - def setUp(self): - super(RemoveInstanceCommandFunctionalTest, self).setUp() - self.create_test_license_file() - self.setup_instances() - self.setup_users() - - def test_default(self): - self.assertEqual(Instance.objects.filter(hostname="127.0.0.2").count(), 1) - result, stdout, stderr = self.run_command('remove_instance', hostname='127.0.0.2') - self.assertIsNone(result) - self.assertEqual(stdout, 'Successfully removed instance (uuid="%s",hostname="127.0.0.2",role="secondary").\n' % (self.uuids[0])) - self.assertEqual(Instance.objects.filter(hostname="127.0.0.2").count(), 0) -