"""
test_geolocate.py
Programmed by: Dante Signal31
email: dante.signal31@gmail.com
"""
from collections import namedtuple
from unittest.mock import patch
import unittest
import geolocate.classes.arguments as args
import geolocate.classes.config as config
import geolocate.tests.console_mocks as console_mocks
import geolocate.tests.testing_tools as testing_tools
ERRONEOUS_ARGUMENT = "erroneous_argument"
Arguments = namedtuple("Arguments", "show_enabled_locators "
"set_locators_preference "
"show_disabled_locators "
"reset_locators_preference "
"set_user "
"set_password")
ErroneousArguments = namedtuple("ErroneousArguments",
" ".join(["show_enabled_locators "
"set_locators_preference "
"show_disabled_locators "
"reset_locators_preference ",
ERRONEOUS_ARGUMENT]))
WORKING_DIR = "./geolocate/"
CONFIGURATION_PATH = config.CONFIG_FILE
[docs]class MockedArguments(object):
""" Used to detect private attributes.
I couldn't use namedtuple because it doesn't admit attributes prefixed
by "_".
"""
def __init__(self, arg1, arg2, arg3, arg4):
self._priv1 = False
self.__priv2 = False
self.show_enabled_locators = arg1
self.set_locators_preference = arg2
self.show_disabled_locators = arg3
self.reset_locators_preference = arg4
[docs]class TestGeoLocate(unittest.TestCase):
[docs] def test_process_optional_parameters_show_enabled_locators(self):
arguments = Arguments(True, None, False, False, None, None)
result = _assert_geolocate_function_called("show_enabled_locators",
arguments)
self.assertTrue(result)
[docs] def test_process_optional_parameters_set_locators_preference(self):
arguments = Arguments(False, ["geoip2_local", "geoip2_webservice"],
False, False, None, None)
result = _assert_geolocate_function_called("set_locators_preference",
arguments)
self.assertTrue(result)
[docs] def test_process_optional_parameters_show_disabled_locators(self):
arguments = Arguments(False, None, True, False, None, None)
result = _assert_geolocate_function_called("show_disabled_locators",
arguments)
self.assertTrue(result)
[docs] def test_process_optional_parameters_reset_locators_preference(self):
arguments = Arguments(False, None, False, True, None, None)
result = _assert_geolocate_function_called("reset_locators_preference",
arguments)
self.assertTrue(result)
[docs] def tests_process_optional_parameters_erroneos_argument(self):
arguments = ErroneousArguments(False, None, False, False, True)
with self.assertRaises(args.NoFunctionAssignedToArgument) as e:
args._execute_function(ERRONEOUS_ARGUMENT, arguments)
self.assertEqual(e.exception.argument, ERRONEOUS_ARGUMENT)
[docs] def test_get_user_attributes(self):
correct_arguments_set = {"show_enabled_locators",
"set_locators_preference",
"show_disabled_locators",
"reset_locators_preference"}
test_arguments_object = MockedArguments(True, True, True, True)
valid_arguments = args._get_user_arguments(test_arguments_object)
self.assertEqual(valid_arguments, correct_arguments_set)
[docs] def test_show_enabled_locators(self):
correct_string = "Enabled locators:\n" \
"geoip2_webservice\n" \
"geoip2_local\n"
with testing_tools.WorkingDirectoryChanged(WORKING_DIR), \
testing_tools.OriginalFileSaved(CONFIGURATION_PATH):
args.reset_locators_preference()
with console_mocks.MockedConsoleOutput() as console:
args.show_enabled_locators()
self._assertConsoleOutputEqual(correct_string, console)
[docs] def test_show_disabled_locators(self):
correct_string = "Disabled locators:\n" \
"geoip2_webservice\n"
enabled_locators = ["geoip2_local", ]
mocked_arguments = Arguments(False, enabled_locators, False, False,
None, None)
with testing_tools.WorkingDirectoryChanged(WORKING_DIR), \
testing_tools.OriginalFileSaved(CONFIGURATION_PATH):
args.set_locators_preference(mocked_arguments)
with console_mocks.MockedConsoleOutput() as console:
args.show_disabled_locators()
self._assertConsoleOutputEqual(correct_string, console)
[docs] def test_set_locators_preference(self):
correct_string = "Enabled locators:\n" \
"geoip2_local\n" \
"geoip2_webservice\n"
new_locators_preference = ["geoip2_local", "geoip2_webservice"]
mocked_arguments = Arguments(False, new_locators_preference, False,
False, None, None)
with testing_tools.WorkingDirectoryChanged(WORKING_DIR), \
testing_tools.OriginalFileSaved(CONFIGURATION_PATH):
args.set_locators_preference(mocked_arguments)
with console_mocks.MockedConsoleOutput() as console:
args.show_enabled_locators()
self._assertConsoleOutputEqual(correct_string, console)
[docs] def test_reset_locators_preference(self):
changed_string = "Enabled locators:\n" \
"geoip2_local\n" \
"geoip2_webservice\n"
correct_string = "Enabled locators:\n" \
"geoip2_webservice\n" \
"geoip2_local\n"
new_locators_preference = ["geoip2_local", "geoip2_webservice"]
mocked_arguments = Arguments(False, new_locators_preference, False,
False, None, None)
with testing_tools.WorkingDirectoryChanged(WORKING_DIR), \
testing_tools.OriginalFileSaved(CONFIGURATION_PATH):
args.set_locators_preference(mocked_arguments)
with console_mocks.MockedConsoleOutput() as console:
args.show_enabled_locators()
returned_output = console.output()
self.assertEqual(returned_output, changed_string)
console.reset()
args.reset_locators_preference()
args.show_enabled_locators()
self._assertConsoleOutputEqual(correct_string, console)
[docs] def test_set_user(self):
user = "user_2015"
returned_string = "User:\n" \
"{0}\n".format(user)
mocked_arguments = Arguments(False, None, False,
False, user, None)
with testing_tools.WorkingDirectoryChanged(WORKING_DIR), \
testing_tools.OriginalFileSaved(CONFIGURATION_PATH):
args.set_user(mocked_arguments)
with console_mocks.MockedConsoleOutput() as console:
args.show_user()
self._assertConsoleOutputEqual(returned_string, console)
[docs] def test_set_password(self):
password = "mocked_password"
returned_string = "Password:\n" \
"{0}\n".format(password)
mocked_arguments = Arguments(False, None, False, False, None,
password)
with testing_tools.WorkingDirectoryChanged(WORKING_DIR), \
testing_tools.OriginalFileSaved(CONFIGURATION_PATH):
args.set_password(mocked_arguments)
with console_mocks.MockedConsoleOutput() as console:
args.show_password()
self._assertConsoleOutputEqual(returned_string, console)
[docs] def test_show_user(self):
user = "user_2015"
returned_string = "User:\n" \
"{0}\n".format(user)
with testing_tools.WorkingDirectoryChanged(WORKING_DIR), \
testing_tools.OriginalFileSaved(CONFIGURATION_PATH):
new_configuration = config.Configuration()
new_configuration.user_id = user
config.save_configuration(new_configuration)
with console_mocks.MockedConsoleOutput() as console:
args.show_user()
self._assertConsoleOutputEqual(returned_string, console)
[docs] def test_show_password(self):
password = "mocked_password"
returned_string = "Password:\n" \
"{0}\n".format(password)
with testing_tools.WorkingDirectoryChanged(WORKING_DIR), \
testing_tools.OriginalFileSaved(CONFIGURATION_PATH):
new_configuration = config.Configuration()
new_configuration.license_key = password
config.save_configuration(new_configuration)
with console_mocks.MockedConsoleOutput() as console:
args.show_password()
self._assertConsoleOutputEqual(returned_string, console)
def _assertConsoleOutputEqual(self, string_to_match, console):
returned_output = console.output()
self.assertEqual(returned_output, string_to_match)
def _assert_geolocate_function_called(function_name, arguments):
target_to_patch = ".".join(["geolocate.classes.arguments", function_name])
with patch(target_to_patch) as mocked_function:
args.process_optional_parameters(arguments)
return mocked_function.called