added tests of delete_tags function

This commit is contained in:
Andrey Pohilko
2017-04-27 17:52:50 +06:00
parent 151a835e3c
commit dcb8344805
3 changed files with 90 additions and 22 deletions

View File

@@ -97,7 +97,7 @@ Delete all tags for all images (do you really want to do it?):
If you are using docker registry with a self signed ssl certificate, you can disable ssl verification: If you are using docker registry with a self signed ssl certificate, you can disable ssl verification:
``` ```
registry.py -l user:pass -r --no-validate-ssl https://example.com:5000 registry.py -l user:pass -r https://example.com:5000 --no-validate-ssl
``` ```

View File

@@ -98,10 +98,6 @@ class Registry:
return r return r
def send(self, path, method="GET"): def send(self, path, method="GET"):
# try: # try:
result = self.http.request( result = self.http.request(
@@ -192,22 +188,22 @@ class Registry:
return True return True
# this function is not used and thus not tested # this function is not used and thus not tested
def delete_tag_layer(self, image_name, layer_digest, dry_run): # def delete_tag_layer(self, image_name, layer_digest, dry_run):
if dry_run: # if dry_run:
print('would delete layer {0}'.format(layer_digest)) # print('would delete layer {0}'.format(layer_digest))
return False # return False
#
print('deleting layer {0}'.format(layer_digest),) # print('deleting layer {0}'.format(layer_digest),)
#
delete_result = self.send('/v2/{0}/blobs/{1}'.format( # delete_result = self.send('/v2/{0}/blobs/{1}'.format(
image_name, layer_digest), method='DELETE') # image_name, layer_digest), method='DELETE')
#
if delete_result == None: # if delete_result == None:
print("failed, error: {0}".format(self.last_error)) # print("failed, error: {0}".format(self.last_error))
return False # return False
#
print("done") # print("done")
return True # return True
def list_tag_layers(self, image_name, tag): def list_tag_layers(self, image_name, tag):

74
test.py
View File

@@ -1,5 +1,5 @@
import unittest import unittest
from registry import Registry, Requests, get_tags from registry import Registry, Requests, get_tags, parse_args, delete_tags
from mock import MagicMock from mock import MagicMock
import requests import requests
@@ -53,6 +53,10 @@ class TestCreateMethod(unittest.TestCase):
self.assertEqual(r.username, None) self.assertEqual(r.username, None)
self.assertEqual(r.password, None) self.assertEqual(r.password, None)
def test_invalid_login(self):
with self.assertRaises(SystemExit):
Registry.create("testhost4", "invalid_login", False)
class TestParseLogin(unittest.TestCase): class TestParseLogin(unittest.TestCase):
def setUp(self): def setUp(self):
@@ -70,6 +74,7 @@ class TestParseLogin(unittest.TestCase):
self.assertEqual(password, "pass:word") self.assertEqual(password, "pass:word")
self.assertEqual(self.registry.last_error, None) self.assertEqual(self.registry.last_error, None)
# this test becomes reduntant
def test_login_args_no_colon(self): def test_login_args_no_colon(self):
(username, password) = self.registry.parse_login("username/password") (username, password) = self.registry.parse_login("username/password")
self.assertEqual(username, None) self.assertEqual(username, None)
@@ -373,6 +378,73 @@ class TestDeletion(unittest.TestCase):
verify=True verify=True
) )
def test_delete_tag_no_digest(self):
self.registry.http.reset_return_value(400, "")
response = self.registry.delete_tag('image1', 'test_tag', False, [])
self.assertFalse(response)
self.assertEqual(self.registry.last_error, 400)
class TestDeleteTagsFunction(unittest.TestCase):
def setUp(self):
self.registry = Registry()
self.delete_mock = MagicMock()
self.registry.delete_tag = self.delete_mock
self.registry.http = MockRequests()
self.registry.hostname = "http://testdomain.com"
self.registry.http.reset_return_value(200, "MOCK_DIGEST")
self.registry.http.return_value.headers = {
'Content-Length': '4935',
'Docker-Content-Digest': 'MOCK_DIGEST_HEADER',
'X-Content-Type-Options': 'nosniff'
}
def test_delete_tags_no_keep(self):
delete_tags(self.registry, "imagename", False, ["tag_to_delete"], [])
self.delete_mock.assert_called_with(
"imagename",
"tag_to_delete",
False,
[]
)
def test_delete_tags_keep(self):
delete_tags(self.registry, "imagename", False, ["tag1", "tag2"], ["tag_to_keep"])
self.delete_mock.assert_called_with(
"imagename",
"tag2",
False,
['MOCK_DIGEST_HEADER']
)
class TestArgParser(unittest.TestCase):
def test_no_args(self):
with self.assertRaises(SystemExit):
parse_args("")
def test_all_args(self):
args_list = ["-r", "hostname",
"-l", "loginstring",
"-d",
"-n", "15",
"--dry-run",
"-i", "imagename1", "imagename2",
"--keep-tags", "keep1", "keep2",
"--tags-like", "tags_like_text",
"--no-validate-ssl",
"--delete-all",
"--layers"]
args = parse_args(args_list)
self.assertTrue(args.delete)
self.assertTrue(args.layers)
self.assertTrue(args.no_validate_ssl)
self.assertTrue(args.delete_all)
self.assertTrue(args.layers)
self.assertEqual(args.image, ["imagename1", "imagename2"])
self.assertEqual(args.num, "15")
self.assertEqual(args.login, "loginstring")
self.assertEqual(args.tags_like, ["tags_like_text"])
self.assertEqual(args.host, "hostname")
self.assertEqual(args.keep_tags, ["keep1", "keep2"])
if __name__ == '__main__': if __name__ == '__main__':