Skip to content
This repository was archived by the owner on Sep 12, 2018. It is now read-only.

Commit f084294

Browse files
committed
Improve coverage of docker_registry.lib
Docker-DCO-1.1-Signed-off-by: Gabor Nagy <[email protected]> (github: Aigeruth)
1 parent 9d0ece4 commit f084294

File tree

9 files changed

+190
-3
lines changed

9 files changed

+190
-3
lines changed

.coveragerc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[report]
2+
exclude_lines =
3+
if __name__ == .__main__.:

docker_registry/lib/index/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def results(self, search_term):
6969
7070
{'name': name, 'description': description}
7171
"""
72-
raise NotImplementedError('results method for {!r}'.format(self))
72+
raise NotImplementedError('results method for {0!r}'.format(self))
7373

7474

7575
def load(kind=None):

tests/lib/__init__.py

Whitespace-only changes.

tests/lib/index/__init__.py

Whitespace-only changes.

tests/lib/index/test__init__.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import mock
2+
import unittest
3+
4+
from docker_registry.lib import index
5+
6+
7+
class TestIndex(unittest.TestCase):
8+
9+
def setUp(self):
10+
self.index = index.Index()
11+
12+
def test_cover_passed_methods(self):
13+
self.index._handle_repository_created(None, None, None, None)
14+
self.index._handle_repository_updated(None, None, None, None)
15+
self.index._handle_repository_deleted(None, None, None)
16+
17+
def test_results(self):
18+
self.assertRaises(NotImplementedError, self.index.results, None)
19+
20+
21+
class TestLoad(unittest.TestCase):
22+
23+
@mock.patch('docker_registry.lib.config.load')
24+
def test_search_backend(self, load):
25+
load.return_value = mock.MagicMock(search_backend='x')
26+
self.assertRaises(NotImplementedError, index.load)

tests/lib/index/test_db.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import mock
2+
import unittest
3+
4+
from docker_registry.lib.index import db
5+
6+
7+
class TestVersion(unittest.TestCase):
8+
9+
def setUp(self):
10+
self.version = db.Version()
11+
12+
def test_repr(self):
13+
self.assertEqual(type(repr(self.version)), str)
14+
15+
16+
class TestRepository(unittest.TestCase):
17+
18+
def setUp(self):
19+
self.repository = db.Repository()
20+
21+
def test_repr(self):
22+
self.assertEqual(type(repr(self.repository)), str)
23+
24+
25+
class TestSQLAlchemyIndex(unittest.TestCase):
26+
27+
def setUp(self):
28+
self.index = db.SQLAlchemyIndex(database="sqlite://")
29+
30+
@mock.patch('sqlalchemy.orm.query.Query.first')
31+
def test_setup_database(self, first):
32+
first = mock.Mock( # noqa
33+
side_effect=db.sqlalchemy.exc.OperationalError)
34+
self.assertRaises(
35+
NotImplementedError, db.SQLAlchemyIndex, database="sqlite://")

tests/lib/test_cache.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import mock
2+
3+
from docker_registry.lib import cache
4+
from tests.base import TestCase
5+
6+
7+
class TestCache(TestCase):
8+
9+
def setUp(self):
10+
self.cache = mock.MagicMock(
11+
host='localhost', port=1234, db=0, password='pass')
12+
13+
def tearDown(self):
14+
cache.redis_conn = None
15+
cache.cache_prefix = None
16+
17+
@mock.patch.object(cache, 'logger')
18+
def test_enable_redis_cache(self, logger):
19+
self.assertEqual(cache.redis_conn, None)
20+
self.assertEqual(cache.cache_prefix, None)
21+
cache.enable_redis_cache(None, None)
22+
self.assertEqual(logger.warn.call_count, 1)
23+
24+
cache.enable_redis_cache(self.cache, None)
25+
self.assertTrue(cache.redis_conn is not None)
26+
self.assertEqual(type(cache.redis_conn), cache.redis.StrictRedis)
27+
self.assertTrue(cache.cache_prefix is not None)
28+
self.assertEqual(cache.cache_prefix, 'cache_path:/')
29+
30+
cache.enable_redis_cache(self.cache, 'test')
31+
self.assertEqual(cache.cache_prefix, 'cache_path:test')
32+
33+
@mock.patch.object(cache, 'logger')
34+
@mock.patch.object(cache.lru, 'init')
35+
def test_enable_redis_lru(self, lru_init, logger):
36+
cache.enable_redis_lru(None, None)
37+
self.assertEqual(logger.warn.call_count, 1)
38+
39+
cache.enable_redis_lru(self.cache, None)
40+
self.assertEqual(logger.info.call_count, 2)
41+
lru_init.assert_called_once_with(
42+
host=self.cache.host, port=self.cache.port, db=self.cache.db,
43+
password=self.cache.password, path='/')
44+
45+
lru_init.reset_mock()
46+
path = 'test'
47+
cache.enable_redis_lru(self.cache, path)
48+
lru_init.assert_called_once_with(
49+
host=self.cache.host, port=self.cache.port, db=self.cache.db,
50+
password=self.cache.password, path=path)

tests/lib/test_checksums.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import mock
2+
3+
from docker_registry.lib import checksums
4+
from tests.base import TestCase
5+
6+
7+
class TestShaMethods(TestCase):
8+
9+
def test_sha256_file(self):
10+
self.assertEqual(
11+
checksums.sha256_file(None, None),
12+
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855')
13+
self.assertEqual(
14+
checksums.sha256_file(None, 'test'),
15+
'9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08')
16+
17+
def test_compute_simple(self):
18+
out = checksums.compute_simple(None, '')
19+
self.assertTrue(out.startswith('sha256:'))
20+
nl = '01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b'
21+
self.assertTrue(out.endswith(nl))
22+
23+
out = checksums.compute_simple(None, 'test')
24+
h = 'f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2'
25+
self.assertTrue(out.endswith(h))
26+
27+
28+
class TestTarSum(TestCase):
29+
30+
def setUp(self):
31+
self.tar_sum = checksums.TarSum(None)
32+
33+
def test_append(self):
34+
self.tar_sum.header_fields = tuple()
35+
member = mock.MagicMock(size=1)
36+
tarobj = mock.MagicMock(
37+
extractfile=mock.MagicMock(side_effect=KeyError))
38+
self.tar_sum.append(member, tarobj)
39+
self.assertEqual(len(self.tar_sum.hashes), 1)
40+
self.assertEqual(
41+
self.tar_sum.hashes[0],
42+
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855')

tests/test_config.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import mock
99
import os
10+
import unittest
1011

1112
from docker_registry.lib import config
1213

@@ -22,14 +23,30 @@ def mockget(key, opt=None):
2223

2324

2425
@mock.patch('os.environ.get', mockget)
25-
class TestConfig():
26+
class TestConfig(unittest.TestCase):
2627

27-
def __init__(self):
28+
def setUp(self):
2829
p = os.path.join(
2930
os.path.dirname(__file__), 'fixtures', 'test_config.yaml')
3031

3132
self.c = config.Config(open(p, 'rb').read())
3233

34+
def test__init__(self):
35+
self.assertRaises(config.exceptions.ConfigError, config.Config, '\1')
36+
37+
@mock.patch('__builtin__.repr')
38+
def test__repr(self, r):
39+
self.c.__repr__()
40+
r.assert_called_once_with(self.c._config)
41+
42+
def test__methods__(self):
43+
self.assertEqual(self.c.__methods__, [])
44+
45+
def test__members__(self):
46+
self.assertEqual(type(self.c.__members__), list)
47+
self.assertEqual(self.c.__members__, self.c.keys())
48+
self.assertEqual(self.c.__members__, self.c.__dir__())
49+
3350
def test_accessors(self):
3451
assert self.c.booltrue == self.c['booltrue']
3552
assert self.c.dict.one == self.c.dict['one']
@@ -133,3 +150,17 @@ def test_write(self):
133150

134151
def test_unicode(self):
135152
assert self.c.uni == u'ß∞'
153+
154+
155+
class TestLoad(unittest.TestCase):
156+
157+
def setUp(self):
158+
self._config = config._config
159+
160+
def tearDown(self):
161+
config._config = self._config
162+
163+
@mock.patch.object(config.os.environ, 'get')
164+
def test_config_path_exception(self, get):
165+
config._config = None
166+
self.assertRaises(config.exceptions.FileNotFoundError, config.load)

0 commit comments

Comments
 (0)