diff --git a/requirements-test.txt b/requirements-test.txt index beeb8e9..5fc11d5 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -4,6 +4,7 @@ mock==1.3.0 pytest==3.0.1 pytest-pep8==1.0.5 pytest-cov==2.2.1 +pytest-mock==1.5.0 cov-core==1.15.0 unittest2==1.1.0; python_version < '2.7' bandit diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/test_app.py b/test/test_app.py index c25399e..2fb3606 100644 --- a/test/test_app.py +++ b/test/test_app.py @@ -1,19 +1,8 @@ -import os -from puppetboard import app -import unittest +import pytest import tempfile - -class AppTestCase(unittest.TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - - def test_first_test(self): - self.assertTrue(True) +from puppetboard import app -if __name__ == '__main__': - unittest.main() +def test_first_test(): + assert app is not None, ("%s" % reg.app) diff --git a/test/test_docker_settings.py b/test/test_docker_settings.py index b9dbb61..e9db63e 100644 --- a/test/test_docker_settings.py +++ b/test/test_docker_settings.py @@ -1,7 +1,7 @@ +import pytest import os from puppetboard import docker_settings -import unittest -import tempfile + try: import future.utils except: @@ -13,80 +13,87 @@ except: pass -class DockerTestCase(unittest.TestCase): - def setUp(self): - for env_var in dir(docker_settings): - if (env_var.startswith('__') or env_var.startswith('_') or - env_var.islower()): - continue +@pytest.fixture(scope='function') +def cleanUpEnv(request): + for env_var in dir(docker_settings): + if (env_var.startswith('__') or env_var.startswith('_') or + env_var.islower()): + continue - if env_var in os.environ: - del os.environ[env_var] - reload(docker_settings) - - def test_default_host_port(self): - self.assertEqual(docker_settings.PUPPETDB_HOST, 'puppetdb') - self.assertEqual(docker_settings.PUPPETDB_PORT, 8080) - - def test_set_host_port(self): - os.environ['PUPPETDB_HOST'] = 'puppetdb' - os.environ['PUPPETDB_PORT'] = '9081' - reload(docker_settings) - self.assertEqual(docker_settings.PUPPETDB_HOST, 'puppetdb') - self.assertEqual(docker_settings.PUPPETDB_PORT, 9081) - - def test_cert_true_test(self): - os.environ['PUPPETDB_SSL_VERIFY'] = 'True' - reload(docker_settings) - self.assertTrue(docker_settings.PUPPETDB_SSL_VERIFY) - os.environ['PUPPETDB_SSL_VERIFY'] = 'true' - reload(docker_settings) - self.assertTrue(docker_settings.PUPPETDB_SSL_VERIFY) - - def test_cert_false_test(self): - os.environ['PUPPETDB_SSL_VERIFY'] = 'False' - reload(docker_settings) - self.assertFalse(docker_settings.PUPPETDB_SSL_VERIFY) - os.environ['PUPPETDB_SSL_VERIFY'] = 'false' - reload(docker_settings) - self.assertFalse(docker_settings.PUPPETDB_SSL_VERIFY) - - def test_cert_path(self): - ca_file = '/usr/ssl/path/ca.pem' - os.environ['PUPPETDB_SSL_VERIFY'] = ca_file - reload(docker_settings) - self.assertEqual(docker_settings.PUPPETDB_SSL_VERIFY, ca_file) - - def validate_facts(self, facts): - self.assertEqual(type(facts), type([])) - self.assertTrue(len(facts) > 0) - for map in facts: - self.assertEqual(type(map), type(())) - self.assertTrue(len(map) == 2) - - def test_inventory_facts_default(self): - self.validate_facts(docker_settings.INVENTORY_FACTS) - - def test_invtory_facts_custom(self): - os.environ['INVENTORY_FACTS'] = "A, B, C, D" - reload(docker_settings) - self.validate_facts(docker_settings.INVENTORY_FACTS) - - def test_graph_facts_defautl(self): - facts = docker_settings.GRAPH_FACTS - self.assertEqual(type(facts), type([])) - self.assertTrue('puppetversion' in facts) - - def test_graph_facts_custom(self): - os.environ['GRAPH_FACTS'] = "architecture, puppetversion, extra" - reload(docker_settings) - facts = docker_settings.GRAPH_FACTS - self.assertEqual(type(facts), type([])) - self.assertEqual(len(facts), 3) - self.assertTrue('puppetversion' in facts) - self.assertTrue('architecture' in facts) - self.assertTrue('extra' in facts) + if env_var in os.environ: + del os.environ[env_var] + reload(docker_settings) + return -if __name__ == '__main__': - unittest.main() +def test_default_host_port(cleanUpEnv): + assert docker_settings.PUPPETDB_HOST == 'puppetdb' + assert docker_settings.PUPPETDB_PORT == 8080 + + +def test_set_host_port(cleanUpEnv): + os.environ['PUPPETDB_HOST'] = 'puppetdb2' + os.environ['PUPPETDB_PORT'] = '9081' + reload(docker_settings) + assert docker_settings.PUPPETDB_HOST == 'puppetdb2' + assert docker_settings.PUPPETDB_PORT == 9081 + + +def test_cert_true_test(cleanUpEnv): + os.environ['PUPPETDB_SSL_VERIFY'] = 'True' + reload(docker_settings) + assert docker_settings.PUPPETDB_SSL_VERIFY is True + os.environ['PUPPETDB_SSL_VERIFY'] = 'true' + reload(docker_settings) + assert docker_settings.PUPPETDB_SSL_VERIFY is True + + +def test_cert_false_test(cleanUpEnv): + os.environ['PUPPETDB_SSL_VERIFY'] = 'False' + reload(docker_settings) + assert docker_settings.PUPPETDB_SSL_VERIFY is False + os.environ['PUPPETDB_SSL_VERIFY'] = 'false' + reload(docker_settings) + assert docker_settings.PUPPETDB_SSL_VERIFY is False + + +def test_cert_path(cleanUpEnv): + ca_file = '/usr/ssl/path/ca.pem' + os.environ['PUPPETDB_SSL_VERIFY'] = ca_file + reload(docker_settings) + assert docker_settings.PUPPETDB_SSL_VERIFY == ca_file + + +def validate_facts(facts): + assert isinstance(facts, list) + assert len(facts) > 0 + for map in facts: + assert isinstance(map, tuple) + assert len(map) == 2 + + +def test_inventory_facts_default(cleanUpEnv): + validate_facts(docker_settings.INVENTORY_FACTS) + + +def test_invtory_facts_custom(cleanUpEnv): + os.environ['INVENTORY_FACTS'] = "A, B, C, D" + reload(docker_settings) + validate_facts(docker_settings.INVENTORY_FACTS) + + +def test_graph_facts_defautl(cleanUpEnv): + facts = docker_settings.GRAPH_FACTS + assert isinstance(facts, list) + assert 'puppetversion' in facts + + +def test_graph_facts_custom(cleanUpEnv): + os.environ['GRAPH_FACTS'] = "architecture, puppetversion, extra" + reload(docker_settings) + facts = docker_settings.GRAPH_FACTS + assert isinstance(facts, list) + assert len(facts) == 3 + assert 'puppetversion' in facts + assert 'architecture' in facts + assert 'extra' in facts diff --git a/test/test_utils.py b/test/test_utils.py index 7a82f48..2db74c2 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -1,8 +1,4 @@ -try: - import unittest2 as unittest -except ImportError: - import unittest - +import pytest import sys import json import mock @@ -22,137 +18,130 @@ from puppetboard.app import NoContent import logging -class UtilsTestCase(unittest.TestCase): - def setUp(self): - pass +def test_json_format(): + demo = [{'foo': 'bar'}, {'bar': 'foo'}] + sample = json.dumps(demo, indent=2, separators=(',', ': ')) - def teadDown(self): - pass - - def test_json_format(self): - demo = [{'foo': 'bar'}, {'bar': 'foo'}] - sample = json.dumps(demo, indent=2, separators=(',', ': ')) - - self.assertEqual(sample, utils.jsonprint(demo), - "Json formatting has changed") - - def test_format_val_str(self): - x = "some string" - self.assertEqual(x, utils.formatvalue(x), - "Should return same value") - - def test_format_val_array(self): - x = ['a', 'b', 'c'] - self.assertEqual("a, b, c", utils.formatvalue(x), - "Should return comma seperated string") - - def test_format_val_dict_one_layer(self): - x = {'a': 'b'} - self.assertEqual("a => b,
", utils.formatvalue(x), - "Should return stringified value") - - def test_format_val_tuple(self): - x = ('a', 'b') - self.assertEqual(str(x), utils.formatvalue(x)) + assert sample == utils.jsonprint(demo), "Json formatting has changed" -@mock.patch('logging.log') -class GetOrAbortTesting(unittest.TestCase): - - def test_get(self, mock_log): - x = "hello world" - - def test_get_or_abort(): - return x - - self.assertEqual(x, utils.get_or_abort(test_get_or_abort)) - - def test_http_error(self, mock_log): - err = "NotFound" - - def raise_http_error(): - x = Response() - x.status_code = 404 - x.reason = err - raise HTTPError(err, response=x) - - with self.assertRaises(NotFound) as error: - utils.get_or_abort(raise_http_error) - mock_log.error.assert_called_with(err) - - def test_http_connection_error(self, mock_log): - err = "ConnectionError" - - def connection_error(): - x = Response() - x.status_code = 500 - x.reason = err - raise ConnectionError(err, response=x) - - with self.assertRaises(InternalServerError) as error: - utils.get_or_abort(connection_error) - mock_log.error.assert_called_with(err) - - @mock.patch('flask.abort') - def test_http_empty(self, mock_log, flask_abort): - err = "Empty Response" - - def connection_error(): - raise EmptyResponseError(err) - - with self.assertRaises(NoContent) as error: - utils.get_or_abort(connection_error) - mock_log.error.assert_called_with(err) - flask_abort.assert_called_with('204') +def test_format_val_str(): + x = "some string" + assert x == utils.formatvalue(x), "Should return same value" -class yieldOrStop(unittest.TestCase): - - def test_iter(self): - test_list = (0, 1, 2, 3) - - def my_generator(): - for i in test_list: - yield i - - gen = utils.yield_or_stop(my_generator()) - self.assertIsInstance(gen, GeneratorType) - - i = 0 - for val in gen: - self.assertEqual(i, val) - i = i + 1 - - def test_stop_empty(self): - def my_generator(): - yield 1 - raise EmptyResponseError - yield 2 - - gen = utils.yield_or_stop(my_generator()) - for val in gen: - self.assertEqual(1, val) - - def test_stop_conn_error(self): - def my_generator(): - yield 1 - raise ConnectionError - yield 2 - - gen = utils.yield_or_stop(my_generator()) - for val in gen: - self.assertEqual(1, val) - - def test_stop_http_error(self): - def my_generator(): - yield 1 - raise HTTPError - yield 2 - - gen = utils.yield_or_stop(my_generator()) - for val in gen: - self.assertEqual(1, val) +def test_format_val_array(): + x = ['a', 'b', 'c'] + assert "a, b, c" == utils.formatvalue(x) -if __name__ == '__main__': - unittest.main() +def test_format_val_dict_one_layer(): + x = {'a': 'b'} + assert "a => b,
" == utils.formatvalue(x) + + +def test_format_val_tuple(): + x = ('a', 'b') + assert str(x) == utils.formatvalue(x) + + +def test_get(): + x = "hello world" + + def test_get_or_abort(): + return x + + assert x == utils.get_or_abort(test_get_or_abort) + + +@pytest.fixture +def mock_log(mocker): + return mocker.patch('logging.log') + + +def test_http_error(mock_log): + err = "NotFound" + + def raise_http_error(): + x = Response() + x.status_code = 404 + x.reason = err + raise HTTPError(err, response=x) + + with pytest.raises(NotFound): + utils.get_or_abort(raise_http_error) + mock_log.error.assert_called_once_with(err) + + +def test_http_connection_error(mock_log): + err = "ConnectionError" + + def connection_error(): + x = Response() + x.status_code = 500 + x.reason = err + raise ConnectionError(err, response=x) + + with pytest.raises(InternalServerError): + utils.get_or_abort(connection_error) + mock_log.error.assert_called_with(err) + + +def test_http_empty(mock_log, mocker): + err = "Empty Response" + + def connection_error(): + raise EmptyResponseError(err) + + flask_abort = mocker.patch('flask.abort') + with pytest.raises(NoContent): + utils.get_or_abort(connection_error) + mock_log.error.assert_called_with(err) + flask_abort.assert_called_with('204') + + +def test_iter(): + test_list = (0, 1, 2, 3) + + def my_generator(): + for i in test_list: + yield i + + gen = utils.yield_or_stop(my_generator()) + assert isinstance(gen, GeneratorType) + + i = 0 + for val in gen: + assert i == val + i = i + 1 + + +def test_stop_empty(): + def my_generator(): + yield 1 + raise EmptyResponseError + yield 2 + + gen = utils.yield_or_stop(my_generator()) + for val in gen: + assert 1 == val + + +def test_stop_conn_error(): + def my_generator(): + yield 1 + raise ConnectionError + yield 2 + gen = utils.yield_or_stop(my_generator()) + for val in gen: + assert 1 == val + + +def test_stop_http_error(): + def my_generator(): + yield 1 + raise HTTPError + yield 2 + gen = utils.yield_or_stop(my_generator()) + for val in gen: + assert 1 == val